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 + -
显示快捷键?