📄 tut24.html
字号:
<br><b><font face="Arial,Helvetica"><font size=-1>
invoke GetDlgItemText,hDlg,IDC_CLASSNAME,addr buffer1,128</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>
invoke GetClassName,wParam,addr buffer,128</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>
invoke lstrcmpi,addr buffer,addr buffer1</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>
.if eax!=0</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>
invoke SetDlgItemText,hDlg,IDC_CLASSNAME,addr buffer</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>
.endif</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>
invoke GetDlgItemText,hDlg,IDC_WNDPROC,addr buffer1,128</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>
invoke GetClassLong,wParam,GCL_WNDPROC</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>
invoke wsprintf,addr buffer,addr template,eax</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>
invoke lstrcmpi,addr buffer,addr buffer1</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>
.if eax!=0</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>
invoke SetDlgItemText,hDlg,IDC_WNDPROC,addr buffer</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>
.endif</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1> .elseif
uMsg==WM_COMMAND</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>
.if lParam!=0</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>
mov eax,wParam</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>
mov edx,eax</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>
shr edx,16</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>
.if dx==BN_CLICKED</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>
.if ax==IDC_EXIT</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>
invoke SendMessage,hDlg,WM_CLOSE,0,0</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>
.else</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>
.if HookFlag==FALSE</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>
invoke InstallHook,hDlg</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>
.if eax!=NULL</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>
mov HookFlag,TRUE</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>
invoke SetDlgItemText,hDlg,IDC_HOOK,addr UnhookText</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>
.endif</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>
.else</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>
invoke UninstallHook</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>
invoke SetDlgItemText,hDlg,IDC_HOOK,addr HookText</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>
mov HookFlag,FALSE</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>
invoke SetDlgItemText,hDlg,IDC_CLASSNAME,NULL</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>
invoke SetDlgItemText,hDlg,IDC_HANDLE,NULL</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>
invoke SetDlgItemText,hDlg,IDC_WNDPROC,NULL</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>
.endif</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>
.endif</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>
.endif</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>
.endif</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1> .else</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>
mov eax,FALSE</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>
ret</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1> .endif</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1> mov
eax,TRUE</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1> ret</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>DlgFunc endp</font></font></b>
<p><b><font face="Arial,Helvetica"><font size=-1>end start</font></font></b>
<p><font face="Arial,Helvetica"><font size=-1>;-----------------------------------------------------
This is the source code of the DLL --------------------------------------</font></font>
<br><b><font face="Arial,Helvetica"><font size=-1>.386</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>.model flat,stdcall</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>option casemap:none</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>include \masm32\include\windows.inc</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>include \masm32\include\kernel32.inc</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>includelib \masm32\lib\kernel32.lib</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>include \masm32\include\user32.inc</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>includelib \masm32\lib\user32.lib</font></font></b>
<p><b><font face="Arial,Helvetica"><font size=-1>.const</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>WM_MOUSEHOOK equ WM_USER+6</font></font></b>
<p><b><font face="Arial,Helvetica"><font size=-1>.data</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>hInstance dd 0</font></font></b>
<p><b><font face="Arial,Helvetica"><font size=-1>.data?</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>hHook dd ?</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>hWnd dd ?</font></font></b>
<p><b><font face="Arial,Helvetica"><font size=-1>.code</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>DllEntry proc hInst:HINSTANCE,
reason:DWORD, reserved1:DWORD</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1> .if
reason==DLL_PROCESS_ATTACH</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>
push hInst</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>
pop hInstance</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1> .endif</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1> mov
eax,TRUE</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1> ret</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>DllEntry Endp</font></font></b>
<p><b><font face="Arial,Helvetica"><font size=-1>MouseProc proc nCode:DWORD,wParam:DWORD,lParam:DWORD</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1> invoke
CallNextHookEx,hHook,nCode,wParam,lParam</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1> mov
edx,lParam</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1> assume
edx:PTR MOUSEHOOKSTRUCT</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1> invoke
WindowFromPoint,[edx].pt.x,[edx].pt.y</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1> invoke
PostMessage,hWnd,WM_MOUSEHOOK,eax,0</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1> assume
edx:nothing</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1> xor
eax,eax</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1> ret</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>MouseProc endp</font></font></b>
<p><b><font face="Arial,Helvetica"><font size=-1>InstallHook proc hwnd:DWORD</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1> push
hwnd</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1> pop
hWnd</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1> invoke
SetWindowsHookEx,WH_MOUSE,addr MouseProc,hInstance,NULL</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1> mov
hHook,eax</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1> ret</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>InstallHook endp</font></font></b>
<p><b><font face="Arial,Helvetica"><font size=-1>UninstallHook proc</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1> invoke
UnhookWindowsHookEx,hHook</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1> ret</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>UninstallHook endp</font></font></b>
<p><b><font face="Arial,Helvetica"><font size=-1>End DllEntry</font></font></b>
<p><font face="Arial,Helvetica"><font size=-1>;----------------------------------------------
This is the makefile of the DLL ----------------------------------------------</font></font>
<p><b><font face="Arial,Helvetica"><font size=-1>NAME=mousehook</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>$(NAME).dll: $(NAME).obj</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>
Link /SECTION:.bss,S /DLL /DEF:$(NAME).def /SUBSYSTEM:WINDOWS /LIBPATH:c:\masm\lib
$(NAME).obj</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>$(NAME).obj: $(NAME).asm</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>
ml /c /coff /Cp $(NAME).asm</font></font></b>
<br>
<h3>
<font face="Arial,Helvetica"><font color="#3366FF"><font size=+0>Analysis:</font></font></font></h3>
<font face="Arial,Helvetica"><font size=-1>The example will display a dialog
box with three edit controls that will be filled with the class name, window
handle and the address of the window procedure associated with the window
under the mouse cursor. There are two buttons, Hook and Exit. When you
press the Hook button, the program hooks the mouse input and the text on
the button changes to Unhook. When you move the mouse cursor over a window,
the info about that window will be displayed in the main window of the
example. When you press Unhook button, the program removes the mouse hook.</font></font>
<br><font face="Arial,Helvetica"><font size=-1>The main program uses a
dialog box as its main window. It defines a custom message, WM_MOUSEHOOK
which will be used between the main program and the hook DLL. When the
main program receives this message, wParam contains the handle of the window
that the mouse cursor is on. Of course, this is an arbitrary arrangement.
I decide to send the handle in wParam for the sake of simplicity. You can
choose your own method of communication between the main program and the
hook DLL.</font></font>
<p><b><font face="Arial,Helvetica"><font size=-1>
.if HookFlag==FALSE</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>
invoke InstallHook,hDlg</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>
.if eax!=NULL</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>
mov HookFlag,TRUE</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>
invoke SetDlgItemText,hDlg,IDC_HOOK,addr UnhookText</font></font></b>
<br><b><font face="Arial,Helvetica"><font size=-1>
.endif</font></font></b>
<p><font face="Arial,Helvetica"><font size=-1>The program maintains a flag,
HookFlag, to monitor the state of the hook. It's FALSE if the hook is not
installed and TRUE if the hook is installed.</font></font>
<br><font face="Arial,Helvetica"><font size=-1>When the user presses Hook
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -