setfun.asm

来自「windows下汇编语言 学习汇编语言好助手」· 汇编 代码 · 共 83 行

ASM
83
字号
;**************************
;文件:SetFun.asm         *
;功能:用线程异步地改变   *
;      窗口的处理函数     *
;**************************
.386p
.model flat,stdcall
include win32.inc
extrn MessageBoxA:proc
extrn CreateThread:proc
extrn TerminateThread:proc
extrn ExitProcess:proc
extrn FindWindowA:proc
extrn Sleep:proc
extrn SetWindowLongA:proc
extrn GetWindowLongA:proc
extrn ExitThread:proc
extrn SetDlgItemTextA:proc

NULL  = 0
MB_OK = 0
GWL_WNDPROC     =   -4
MB_OK_ID	= 2
MB_STATIC_ID	= 0FFFFH

.data 
	Welcome db '你按了“确定”或“X”按钮'
	Times	db 30H
			db '次',0
	Text    db '您好!请按确定10次退出程序!',0
	OK 		db 'This is a sample',0
	OldProc	dd ?
	
	ThreadID dd ?
	hThread  dd ?

.code
main:	
	call CreateThread,NULL,0,offset ThreadProc,0,0,offset ThreadID
	mov  hThread,eax

	call MessageBoxA,0,offset Text,offset OK,MB_OK
	call ExitProcess,0

;线程处理函数	
ThreadProc proc
ThreadBegin:
	call FindWindowA,NULL,offset OK	
	or 	 eax,eax				;窗口存在否
	jnz  change
	call Sleep,500
	jmp  ThreadBegin
change:
	push eax
	call GetWindowLongA,eax,GWL_WNDPROC	;设置窗口过程
	mov  [OldProc],eax
	pop  eax
	call SetWindowLongA,eax,GWL_WNDPROC,offset NewProc
Error:
	ret
ThreadProc endp

;新的MessageBox窗口处理函数
NewProc proc uses ebx edi esi, handle:DWORD, wMsg:DWORD, wParam1:DWORD, lParam1:DWORD
	cmp  wMsg,WM_COMMAND
	jz   command
	jmp  old
command:
	mov  ebx,wParam1
	cmp  bx,MB_OK_ID
	jnz  old
	inc  [Times]				;点击次数加1
	cmp  [Times],3AH			;够10次
	jz   old
	call SetDlgItemTextA,handle,MB_STATIC_ID,offset Welcome
	ret
old:
	mov  eax,[OldProc]
	call eax,handle,wMsg,wParam1,lParam1
	ret
NewProc endp
	end main

⌨️ 快捷键说明

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