HHOOK SetWindowsHookEx( int idHook, HOOKPROC lpfn, HINSTANCE hMod, DWORD dwThreadId );
参数说明:
idHook: 钩子类型
WH_SYSMSGFILTER: 监视与调用线程在同一桌面上的控件消息
lpfn:指向过程函数的指针
如果dwThreadId =0 或者被不同进程创建的线程,那么lpfn 必须指向是DLL的钩子
否则,lpfn指向当前进程中定义的钩子过程
hMod: 包含指向lpfn参数的钩子的DLL句柄, 如果dwThreadId指示的线程是当前进程创建并且关联到当前进程的钩子
那么hMod 设置为NULL
dwThreadId: 钩子过程关联的线程,如果为0, 为全局钩子,将监视当前调用线程同一桌面的所有的消息
SetWindowsHookEx : 把一个新的钩子 加入到钩子链中, 最后加入的钩子在链的最前面
返回值: 成功,钩子过程的句柄; 失败返回NULL
描述:
SetWindowsHookEx 可以进行DLL 注入到另外一个进程,但是32位 DLL不能注入到64位进程, 64位DLL的也不能注入到32位的进程中。
如果使用钩子进行注入DLL, 32位的DLL 和64位饿DLL 需要名称不相同
如果hMod = NULL,并且 (dwThreadId=0, 或者dwThreadId被另外一个进程创建),那么将抛出错误。
建议调用 CallNextHookEx 把事件往下一个钩子传递, 否则最终程序获取不到事件,也有可能导致系统错误。 除非你一定不想让消息往下传递。
在中断程序前, 一定要调用 UnhookWindowsHookEx 去是否钩子所占用的系统资源
Hook | Scope |
---|---|
WH_CALLWNDPROC | Thread or global |
WH_CALLWNDPROCRET | Thread or global |
WH_CBT | Thread or global |
WH_DEBUG | Thread or global |
WH_FOREGROUNDIDLE | Thread or global |
WH_GETMESSAGE | Thread or global |
WH_JOURNALPLAYBACK | Global only |
WH_JOURNALRECORD | Global only |
WH_KEYBOARD | Thread or global |
WH_KEYBOARD_LL | Global only |
WH_MOUSE | Thread or global |
WH_MOUSE_LL | Global only |
WH_MSGFILTER | Thread or global |
WH_SHELL | Thread or global |
WH_SYSMSGFILTER | Global only |
如果既是线程钩子又是全局钩子, 那么先调用线程钩子,再调用全局钩子。
Minimum DLL Version | user32.dll |
---|---|
Header | Declared in Winuser.h, include Windows.h |
Import library | User32.lib |
Minimum operating systems | Windows 95, Windows NT 3.1 |
Unicode | Implemented as ANSI and Unicode versions |
测试:
1.线程钩子
创建MFC 对话框应用程序, 在OnInitDialog 中加入 代码
SetWindowsHookEx(WH_MOUSE,(HOOKPROC)MouseProc,NULL,GetCurrentThreadId());
添加钩子过程函数:
LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam ) { }
LRESULT CallNextHookEx( HHOOK hhk, int nCode, WPARAM wParam, LPARAM lParam );此函数, 是把参数传递到当前钩子链中的下一个钩子
问题: VS2010生成 lib 文件
VS2010默认生成dll,但不生成Lib文件,方法是:在所建工程上单击鼠标右键,在弹出的右键菜单中选择“添加-->新建项....---->模块定义文件”,在该模块定义文件中写导出函数表,单击确定。然后在所建工程上单击鼠标右键,选择“属性”菜单,在弹出的属性对话框中“链接器-->输入-->模块定义文件”中填写刚才定义的def文件,然后再重新编译即可生成LIB文件。
WH_GETMESSAGE是从消息队列中取消息, 而WH_CALLWNDPROC 是获取发送中前的消息
WH_GETMESSAGE Hook只拦截由GetMessage or PostMessage的消息,不能拦截由SendMessage引起的消息。
the WH_GETMESSAGE hook enables an application to monitor messages about to be returned by the GetMessage or PeekMessage function. You can use the WH_GETMESSAGE hook to monitor mouse and keyboard input and other messages posted to the message queue.
要Hook SendMessage必须Hook WH_CALLWNDPROC and WH_CALLWNDPROCRET Hooks
The WH_CALLWNDPROC and WH_CALLWNDPROCRET hooks enable you to monitor messages sent to window procedures by the SendMessage function. Windows calls a WH_CALLWNDPROC hook procedure before passing the message to the receiving window procedure, and calls the WH_CALLWNDPROCRET hook procedure after the window procedure has processed the message.
The WH_CALLWNDPROCRET hook passes the address of a CWPRETSTRUCT structure to the hook procedure. The structure contains the return value from the window procedure that processed the message, as well as the message parameters associated with the message. Subclassing the window does not work for messages set between processes.
事列源码 : 线程钩子