pager.asm
来自「windows下汇编语言 学习汇编语言好助手」· 汇编 代码 · 共 286 行
ASM
286 行
;********************
;文件:Pager.asm *
;功能:虚拟6个桌面 *
;********************
.386p
.model flat,stdcall
include win32.inc
extrn MessageBoxA:proc
extrn ExitProcess:proc
extrn GetModuleHandleA:proc
extrn DialogBoxParamA:proc
extrn EndDialog:Proc
extrn GetWindowRect:proc
extrn MoveWindow:proc
extrn GetWindowLongA:proc
extrn SetDlgItemTextA:proc
extrn ShowWindow:proc
extrn GetWindowTextA:proc
extrn GetClassNameA:proc
extrn lstrcmpA:proc
extrn EnumWindows:proc
IDC_BUTTON0 =100
IDC_BUTTON1 =101
IDC_BUTTON2 =102
IDC_BUTTON3 =103
IDC_BUTTON4 =104
IDC_BUTTON5 =105
TRUE = 1
FALSE = 0
GWL_STYLE = (-16)
RECT struc
left dd ?
top dd ?
right dd ?
bottom dd ?
RECT ends
.data
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
.code
Start:
call GetModuleHandleA,0 ;取得模块句柄,返回结果在eax中
;调用DialogBoxParamA显示对话框
call DialogBoxParamA,eax,offset DialogName,0,offset DialogProc,0
cmp eax,0 ;成功否?
jnz Exit ;成功则退出
;显示出错信息
call MessageBoxA,0,offset TextFail,offset CaptionFail,MB_OK
Exit:
call ExitProcess,0 ;退出进程
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++
;对话框消息处理过程
DialogProc proc uses ebx edi esi, hWnd:DWORD, wMsg:DWORD, wParam:DWORD, lParam:DWORD
cmp wMsg,WM_INITDIALOG
jz WmInitDialog
cmp wMsg,WM_CLOSE
jz WmClose
cmp wMsg,WM_NCLBUTTONDBLCLK
jz Lessen
cmp wMsg,WM_COMMAND
jz WmCommand
jmp ExitProc
WmInitDialog: ;对话框初始化处理
call InitDlg,hWnd
jmp ExitProc
WmClose: ;用户按下了Alt-F4或单击右上角X按扭
call ShowAll
call EndDialog,hWnd,1 ;关闭对话框
jmp ExitProc
Lessen:
call GetWindowRect,hWnd,offset rect
mov ebx,rect.right
sub ebx,rect.left
mov eax,[min]
or eax,eax
jnz max
call MoveWindow,hWnd,rect.left,rect.top,ebx,22,TRUE
mov [min],TRUE
jmp ExitProc
max:
call MoveWindow,hWnd,rect.left,rect.top,ebx,143,TRUE
mov [min],FALSE
jmp ExitProc
WmCommand:
mov ebx,wParam
cmp bx,IDOK ;是按下了“退出”按钮?
jz OKPress
cmp bx,IDC_BUTTON0
jz Button0Press
cmp bx,IDC_BUTTON1
jz Button1Press
cmp bx,IDC_BUTTON2
jz Button2Press
cmp bx,IDC_BUTTON3
jz Button3Press
cmp bx,IDC_BUTTON4
jz Button4Press
cmp bx,IDC_BUTTON5
jz Button5Press
OKPress:
jmp WmClose ;关闭对话框
Button0Press: ;用户点击了桌面0
call ChangeTo,0
jmp ExitProc
Button1Press: ;用户点击了桌面1
call ChangeTo,1
jmp ExitProc
Button2Press: ;用户点击了桌面2
call ChangeTo,2
jmp ExitProc
Button3Press: ;用户点击了桌面3
call ChangeTo,3
jmp ExitProc
Button4Press: ;用户点击了桌面4
call ChangeTo,4
jmp ExitProc
Button5Press: ;用户点击了桌面5
call ChangeTo,5
jmp ExitProc
ExitProc: ;退出消息处理
xor eax,eax
ret
DialogProc endp
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++
;取Program Manager和任务栏句柄
GetSysWin proc , hwin:DWORD , param:DWORD
call GetClassNameA,hwin,offset TitleTmp,255
call lstrcmpA,offset TitleTmp,offset ClassShell
or eax,eax
jnz Next
mov eax,hwin
mov [hShell],eax
jmp GetSysWinExit
Next:
call GetWindowTextA,hwin,offset TitleTmp,255
call 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
call SetDlgItemTextA,eax,100,offset Active
call 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
call 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]
call ShowWindow,hwin1,SW_HIDE
HideNowExit:
mov eax,1
ret
HideNow endp
;转到用户指定的桌面
ChangeTo proc ,to:DWORD
mov eax,[now]
add eax,100
call SetDlgItemTextA,[hMainWin],eax,offset NotActive
mov eax,to
add eax,100
call 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
call 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
call 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
call 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 + =
减小字号Ctrl + -
显示快捷键?