SetWinEventHook和SetWindowsHookEx的异同

SetWinEventHook 和 SetWindowsHookEx 都可以指定钩子函数(hook function)来截取别的进程中的消息,但是他们之间有一些不同。

SetWindowsHookEx 有两种钩子函数,一种是全局钩子(global hook),另一种是线程钩子(thread hook)。全局钩子能够截取所有线程的消息,但是全局钩子函数必须存在于一个 dll 中。线程钩子只能截取属于当前进程中的线程的消息,钩子函数不需要放在 dll 中。SetWinEventHook 也有两种钩子函数,一种是进程内钩子(in-context hook),另一种是进程外钩子(out-of-context hook)。进程内钩子函数必须放在 dll 中,将被映射到所有进程中。进程外钩子函数不会被映射到别的进程中,所以也不需要被放到 dll 中。不管进程内或进程外钩子都能截取到所有进程的消息,区别仅是进程内钩子效率更高。

SetWindowsHookEx 和 SetWinEventHook 两种方法截取的消息的类型不一样。SetWindowsHookEx 能截取所有WM_ 开头的消息。而 SetWinEventHook 截取的消息都是 EVENT_ 开头的,这些消息所有都是跟对象的状态相关的,所以它无法获取根鼠标键盘相关的消息。

SetWindowsHookEx 设定的全局钩子必须被注入到别的进程中,所以就无法截取到一些有限制的进程的消息,比如命令行窗口(console window)。而 SetWinEventHook 的进程外钩子就没有这个限制。

 

`SetWindowsHookEx`是一个Windows API函数,用于安装一个全局的或局部的钩子函数。该函数可以用于截获和处理系统和应用程序的消息和事件,比如键盘、鼠标、消息等。使用钩子函数可以实现一些高级的功能,如键盘记录、鼠标跟踪、窗口监控等。 `SetWindowsHookEx`的函数原型如下: ```c++ HHOOK SetWindowsHookEx( int idHook, HOOKPROC lpfn, HINSTANCE hMod, DWORD dwThreadId ); ``` 其中,参数含义如下: - `idHook`:指定需要安装的钩子类型,可以使用以下常量中的一个或多个来指定钩子类型: - `WH_KEYBOARD`:键盘钩子。 - `WH_MOUSE`:鼠标钩子。 - `WH_CALLWNDPROC`:消息钩子。 - `WH_CBT`:窗口钩子。 - `WH_GETMESSAGE`:获取消息钩子。 - `WH_JOURNALRECORD`:记录钩子。 - `WH_KEYBOARD_LL`:低级键盘钩子。 - `WH_MOUSE_LL`:低级鼠标钩子。 - `lpfn`:指定钩子函数的地址,该函数的原型为`LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)`,其中`nCode`表示钩子类型,`wParam`和`lParam`表示传递给钩子函数的消息和事件参数。钩子函数必须返回一个值,具体取决于钩子类型。 - `hMod`:指定包含钩子函数的模块的句柄,通常可以设置为NULL。 - `dwThreadId`:指定需要安装钩子线程ID,如果为0,则表示钩子函数将被安装到系统的所有线程中,为全局钩子。 例如,以下代码安装一个键盘钩子: ```c++ HHOOK hHook = SetWindowsHookEx(WH_KEYBOARD, HookProc, NULL, 0); ``` 需要注意的是,安装钩子函数需要有足够的权限,并且需要谨慎使用,不当的使用可能会对系统和应用程序的稳定性产生不良影响。同时,安装钩子函数后,需要在使用完毕后及时卸载,否则可能会导致钩子函数一直运行,耗费系统资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值