【发布时间】:2016-11-02 01:02:06
【问题描述】:
说,如果我在我的可执行进程中设置了global hook procedure:
//Set global hook
hHook = ::SetWindowsHookEx(WH_KEYBOARD_LL, HookWndProc_WH_KEYBOARD_LL,
::GetModuleHandle(NULL), NULL);
这个进程崩溃了。
这个全局钩子会发生什么?
【问题讨论】:
-
钩子被移除了。
-
是什么让您认为这将是一个 global 挂钩程序?全局挂钩必须驻留在
dll中,GetModuleHandle(NULL) 返回一个exe句柄。 -
@dxiv:将
0x0(不知道为什么OP 使用NULL)将dwThreadId 传递给SetWindowsHookEx使其成为全局挂钩。低级键盘钩子不需要在 DLL 中实现(请参阅LowLevelKeyboardProc:“在安装它的线程的上下文中调用此钩子。”)。与将 DLL 注入目标进程的其他全局挂钩不同,此挂钩是通过消息发送实现的。 -
@dxiv:why low-level hooks aren't injected 的解释很好。
-
@IInspectable 您对 LL 挂钩是正确的,感谢您的更正。 FWIW 甚至 SetWindowsHookEx 的 MSDN 页面在这一点上都是错误的:
hMod [in] - Type: HINSTANCE - A handle to the *DLL* containing the hook procedure pointed to by the lpfn parameter.。