⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 win.asm

📁 模拟了6个桌面 我的QQ:2891
💻 ASM
字号:
.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
include \masm32\include\gdi32.inc
includelib \masm32\lib\gdi32.lib

include \masm32\include\ws2_32.inc
includelib \masm32\lib\ws2_32.lib
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
DialogProc  proto   :DWORD,:DWORD,:DWORD,:DWORD
ChangeTo    proto   :DWORD
InitDlg     proto   :DWORD
ShowAll     proto


IDC_BUTTON1      =101
IDC_BUTTON2      =102
IDC_BUTTON3      =103
IDC_BUTTON4      =104
IDC_BUTTON5      =105
IDC_BUTTON6      =106


.data 
ClassName db "SimpleWinClass",0
AppName  db "Our First Window",0
ButtonClass db  "button",0
Button1     db  0,"按钮1",0
Button2     db  0,"按钮2",0
Button3     db  0,"按钮3",0
Button4     db  0,"按钮4",0
Button5     db  0,"按钮5",0
Button6     db  0,"按钮6",0
	DialogName	db 'MyDialog',0
	CaptionFail	db '失败!',0
	TextFail	db 'API:DialogBoxParamA调用失败!',0

	MAXWINCOUNT	=  150
	Handles		dd 6*MAXWINCOUNT dup (?)
	WinCount	dd 6 dup (0)

	hMainWin	dd ?
	TitleTmp	db 256 dup (?)
	TitleManager	db 'Program Manager',0
	ClassShell		db 'Shell_TrayWnd',0
	hManager	dd ?
	hShell		dd ?
	now			dd 0
	OffsetHandle	dd ?

	min			dd 0
	rect		RECT<>
	NotActive	db 0
	Active 		db 'Active',0
.data?
hInstance HINSTANCE ?
CommandLine LPSTR ?
BUTTON1      dword   ?
BUTTON2      dword   ?
BUTTON3      dword   ?
BUTTON4      dword   ?
BUTTON5      dword   ?
BUTTON6      dword   ?
;BUTTON7      dword   ?
FONT        dword   ?
.code
start:
	invoke GetModuleHandle, NULL
	mov    hInstance,eax
	invoke GetCommandLine
	mov    CommandLine,eax
	invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
	invoke ExitProcess,eax
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
	LOCAL wc:WNDCLASSEX
	LOCAL msg:MSG
	LOCAL hwnd:HWND
	mov   wc.cbSize,SIZEOF WNDCLASSEX
	mov   wc.style, CS_HREDRAW or CS_VREDRAW
	mov   wc.lpfnWndProc, OFFSET WndProc
	mov   wc.cbClsExtra,NULL
	mov   wc.cbWndExtra,NULL
	push  hInstance
	pop   wc.hInstance
	mov   wc.hbrBackground,2
	mov   wc.lpszMenuName,NULL
	mov   wc.lpszClassName,OFFSET ClassName
	invoke LoadIcon,NULL,IDI_APPLICATION
	mov   wc.hIcon,eax
	mov   wc.hIconSm,eax
	invoke LoadCursor,NULL,IDC_ARROW
	mov   wc.hCursor,eax
	invoke RegisterClassEx, addr wc
	INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\
           WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
           CW_USEDEFAULT,400,200,NULL,NULL,\
           hInst,NULL
	mov   hwnd,eax
	invoke ShowWindow, hwnd,SW_SHOWNORMAL
	invoke UpdateWindow, hwnd
      invoke SetWindowPos,hwnd, HWND_TOPMOST,NULL,NULL,NULL,NULL,SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE 
	.WHILE TRUE
		invoke GetMessage, ADDR msg,NULL,0,0
		.BREAK .IF (!eax)
		invoke TranslateMessage, ADDR msg
		invoke DispatchMessage, ADDR msg
	.ENDW
	mov     eax,msg.wParam
	ret
WinMain endp
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
        LOCAL   Font:LOGFONT
	.IF uMsg==WM_DESTROY
		invoke PostQuitMessage,NULL
	.elseif uMsg==WM_LBUTTONDOWN

	.elseif uMsg==WM_COMMAND
            mov eax,wParam
            .if eax==IDC_BUTTON1
                invoke	ChangeTo,0
            .elseif eax==IDC_BUTTON2
                invoke	ChangeTo,1
            .elseif  eax==IDC_BUTTON3
                invoke	ChangeTo,2
            .elseif  eax==IDC_BUTTON4
                invoke	ChangeTo,3
            .elseif  eax==IDC_BUTTON5
                invoke	ChangeTo,4
            .elseif  eax==IDC_BUTTON6
                invoke	ChangeTo,5
            .endif
      .elseif uMsg==WM_CLOSE
	      invoke	ShowAll
	      invoke	EndDialog,hWnd,1	;关闭对话框
            invoke DefWindowProc,hWnd,uMsg,wParam,lParam
            ret
      .elseif uMsg==WM_CREATE
            
            invoke CreateWindowEx,NULL,offset ButtonClass,addr Button1,\
                                  WS_CHILD + WS_VISIBLE + WS_BORDER +BS_PUSHBUTTON,\
                                  10,20,60,40,hWnd,IDC_BUTTON1,hInstance,NULL
            mov     BUTTON1,eax
            invoke GetStockObject,SYSTEM_FIXED_FONT
            mov    FONT,eax
            mov    Font.lfFaceName[0],'G'   ;Fixedsys Gautami
            mov    Font.lfFaceName[1],'a'
            mov    Font.lfFaceName[2],'u'
            mov    Font.lfFaceName[3],'t'
            mov    Font.lfFaceName[4],'a'
            mov    Font.lfFaceName[5],'m'
            mov    Font.lfFaceName[6],'i'
            mov    Font.lfFaceName[7],0
            invoke SendMessage,BUTTON1,WM_SETFONT,sizeof Font,addr Font
            invoke CreateWindowEx,NULL,offset ButtonClass,addr Button2,\
                                  WS_CHILD + WS_VISIBLE + WS_BORDER +BS_PUSHBUTTON +BS_USERBUTTON,\
                                  80,20,60,40,hWnd,IDC_BUTTON2,hInstance,NULL
            mov    BUTTON2,eax
            invoke SendMessage,BUTTON2,WM_SETFONT,FONT,0
            invoke CreateWindowEx,NULL,offset ButtonClass,addr Button3,\
                                  WS_CHILD + WS_VISIBLE + WS_BORDER +BS_PUSHBUTTON +BS_USERBUTTON,\
                                  150,20,60,40,hWnd,IDC_BUTTON3,hInstance,NULL
            mov    BUTTON3,eax
            invoke SendMessage,BUTTON3,WM_SETFONT,FONT,0

            invoke CreateWindowEx,NULL,offset ButtonClass,addr Button4,\
                                  WS_CHILD + WS_VISIBLE + WS_BORDER +BS_PUSHBUTTON +BS_USERBUTTON,\
                                  10,70,60,40,hWnd,IDC_BUTTON4,hInstance,NULL
            mov    BUTTON4,eax
            invoke SendMessage,BUTTON4,WM_SETFONT,FONT,0

            invoke CreateWindowEx,NULL,offset ButtonClass,addr Button5,\
                                  WS_CHILD + WS_VISIBLE + WS_BORDER +BS_PUSHBUTTON +BS_USERBUTTON,\
                                  80,70,60,40,hWnd,IDC_BUTTON5,hInstance,NULL
            mov    BUTTON5,eax
            invoke SendMessage,BUTTON5,WM_SETFONT,FONT,0

            invoke CreateWindowEx,NULL,offset ButtonClass,addr Button6,\
                                  WS_CHILD + WS_VISIBLE + WS_BORDER +BS_PUSHBUTTON +BS_USERBUTTON,\
                                  150,70,60,40,hWnd,IDC_BUTTON6,hInstance,NULL
            mov    BUTTON6,eax
            invoke SendMessage,BUTTON6,WM_SETFONT,FONT,0
            invoke	InitDlg,hWnd
	.ELSE
		invoke DefWindowProc,hWnd,uMsg,wParam,lParam		
		ret
	.ENDIF
	xor eax,eax
	ret
WndProc endp

;取Program Manager和任务栏句柄
GetSysWin proc , hwin:DWORD , param:DWORD
	invoke	GetClassNameA,hwin,offset TitleTmp,255
	invoke	lstrcmpA,offset TitleTmp,offset ClassShell
	or		eax,eax
	jnz		Next
	mov		eax,hwin
	mov		[hShell],eax
	jmp		GetSysWinExit
Next:
	invoke	GetWindowTextA,hwin,offset TitleTmp,255
	invoke	lstrcmpA,offset TitleTmp,offset TitleManager
	or		eax,eax
	jnz		GetSysWinExit
	mov		eax,hwin
	mov		[hManager],eax
GetSysWinExit:
	mov		eax,1
	ret
GetSysWin endp
;初始化
InitDlg proc, hdlg1:DWORD
	mov		eax,hdlg1
	mov		hMainWin,eax
	invoke	SetDlgItemText,eax,101,addr Active
	invoke	EnumWindows,offset GetSysWin,0
	ret
InitDlg endp
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++
;保存现在的桌面的可视窗口
HideNow proc , hwin1:DWORD , param1:DWORD
	mov		eax,hMainWin
	cmp		hwin1,eax
	jz		HideNowExit
	mov		eax,hShell
	cmp		hwin1,eax
	jz		HideNowExit
	mov		eax,hManager
	cmp		hwin1,eax
	jz		HideNowExit
	invoke	GetWindowLongA,hwin1,GWL_STYLE
	test	eax,WS_VISIBLE
	jz		HideNowExit

	mov		ecx,OffsetHandle
	mov		eax,hwin1
	mov		[ecx],eax
	add		ecx,4
	mov		OffsetHandle,ecx

	mov		eax,now
	shl		eax,2
	inc		dword ptr [WinCount+eax]
	invoke	ShowWindow,hwin1,SW_HIDE
HideNowExit:
	mov		eax,1
	ret
HideNow endp

;转到用户指定的桌面
ChangeTo proc ,to:DWORD
      
	;mov		eax,offset BUTTON1
      mov         eax,now
      add		eax,101
	invoke	SetDlgItemTextA,hMainWin,eax,offset NotActive
      lea         eax,BUTTON1
      mov         eax,101
	add		eax,to
	invoke	SetDlgItemTextA,hMainWin,eax,offset Active
	
	mov		eax,to
	cmp		eax,now
	jz		ChangeToExit

	mov		eax,now
	mov		ebx, MAXWINCOUNT*4
	mul		ebx
	mov		esi,offset Handles
	add		eax,esi
	mov		OffsetHandle,eax

	mov		eax,now
	mov		dword ptr [WinCount+eax*4],0
	invoke	EnumWindows,offset HideNow,0
	mov		eax,to
	mov		now,eax

	mov		ecx,[WinCount+eax*4]
	mov		ebx,MAXWINCOUNT*4
	mul		ebx
	mov		esi,offset Handles
	add		esi,eax
again:	
	jecxz	ChangeToExit
	push	ecx
	invoke	ShowWindow,dword ptr [esi],SW_SHOW
	pop		ecx
	dec		ecx
	add		esi,4
	jmp		again
	
ChangeToExit:
	ret
ChangeTo endp
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++
;程序退出时显示所有保存的窗口
ShowAll proc
	mov		edx,offset WinCount
	mov		esi,offset Handles
	
show1:	
	mov		ecx,[edx]
	jcxz	ok
	
	push	esi
show2:	
	push	esi
	push	ecx
	push	edx
	invoke	ShowWindow,dword ptr [esi],SW_SHOW
	pop		edx
	pop		ecx
	pop		esi
	add		esi,4
	dec		ecx
	jnz		show2
	pop		esi
ok:
	add		edx,4
	add		esi,MAXWINCOUNT*4
	cmp		edx,offset WinCount + 4*6
	jb		show1

	ret
ShowAll endp
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++
	end start

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -