极菜的问题:关于鼠标hook

ExitWindows 2005-11-04 09:58:17
最近学汇编,书上一例题:利用dll来hook全局鼠标,但我的程序只能hook到鼠标在本程序窗口内移动时的情况,对鼠标在其它程序窗口中的移动根本就没反应,成了局部hook,请大侠指点问题出在哪里?
HOOK DLL 源文件MasmMouseHookDll.asm如下:
;--------------------------------------------------
.386
.model flat, stdcall
option casemap:none
include d:\masm32\include\windows.inc
include d:\masm32\include\kernel32.inc
include d:\masm32\include\user32.inc
includelib d:\masm32\lib\kernel32.lib
includelib d:\masm32\lib\user32.lib

.const
myWM_MOUSEHOOK equ WM_USER + 1006

.data
hInstance dd 0

.data?
hHook dd ?
hWnd dd ?

.code
DllEntry proc hInst:HINSTANCE, reason:DWORD, reserved1:DWORD
push hInst
pop hInstance
mov eax, TRUE
ret
DllEntry endp

MouseProc proc nCode:DWORD, wParam:DWORD, lParam:DWORD
invoke CallNextHookEx, hHook, nCode, wParam, lParam
push eax
mov edx, lParam
assume edx: PTR MOUSEHOOKSTRUCT
.IF nCode==HC_ACTION
invoke PostMessage, hWnd, myWM_MOUSEHOOK, [edx].pt.x, [edx].pt.y
.ENDIF
assume edx: nothing
pop eax
ret
MouseProc endp

InstallHook proc hwnd:DWORD
push hwnd
pop hWnd
invoke SetWindowsHookEx, WH_MOUSE, addr MouseProc, hInstance, NULL
mov hHook, eax
ret
InstallHook endp

UninstallHook proc
invoke UnhookWindowsHookEx, hHook
ret
UninstallHook endp

End DllEntry
;--------------------------------------------------

相应的makefile如下:
NAME=MasmMouseHookDll
$(NAME).dll: $(NAME).obj
Link /subsystem:windows /Dll /section:.bss,S /DEF:$(NAME).def /LIBPATH:d:\masm32\lib $(NAME).obj
$(NAME).obj: $(NAME).asm
ml /c /coff /Cp $(NAME).asm

主窗口程序用VC++6编写,主要有一个“Hook”按钮用来执行DLL中的InstallHook,一个“Unhook”按钮来执行DLL中的UninstallHook,窗口处理消息WM_USER + 1006,在一个编辑框中显示鼠标的位置。但只有当鼠标在本窗口中移动时有效,在其它窗口移动时无效。
请大侠指教一下,问题出在哪里?先谢谢了。

...全文
88 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
VxD1 2005-11-05
  • 打赏
  • 举报
回复
一般的hook类型必须放到dll文件中才能全局hook
这个问题在这里找不到帖,到mfc那里找找
ExitWindows 2005-11-05
  • 打赏
  • 举报
回复
奇怪,这种普遍性的问题在论坛中居然找不到历史记录。
有哪位大侠来指点一下?
大熊猫侯佩 2005-11-05
  • 打赏
  • 举报
回复
我试了一下,可以 hook 全局的,我的框架如下,我不知道你在 vc
中是如何调用的?

.386
.model flat,stdcall
option casemap:none

include i:\masm32\include\windows.inc
include i:\masm32\include\user32.inc
includelib i:\masm32\lib\user32.lib
include i:\masm32\include\kernel32.inc
includelib i:\masm32\lib\kernel32.lib

.data?
hdll dd ?
hhook dd ?
buf db 256 dup(?)

.code
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
_hookfuc proc _ncode,_wparam,_lparam

pushad

invoke CallNextHookEx,hhook,_ncode,_wparam,_lparam

;do you want ... ...

popad

ret

_hookfuc endp
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
_dllentry proc _hinstance,_dwreason,_dwreserved

mov eax,_dwreason

.if eax == DLL_PROCESS_ATTACH

mov eax,_hinstance
mov hdll,eax

.endif

mov eax,TRUE
ret

_dllentry endp
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sethook proc

pushad

invoke SetWindowsHookEx,WH_MOUSE,addr _hookfuc,
hdll,0
mov hhook,eax

popad

ret

sethook endp
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
unhook proc

pushad

invoke UnhookWindowsHookEx,hhook

popad

ret

unhook endp
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
end _dllentry
ExitWindows 2005-11-05
  • 打赏
  • 举报
回复
原因找到了,是因为我把这个DLL放在VC++6.0的环境中编译了。换成手工编译就行了。
楼上的大侠写VxD ?现在好象都不用这个了吧。

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧