📄 win.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 + -