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