我安装了一个全局鼠标钩子函数,如下所示:
mouseEventHook = ::SetWindowsHookEx( WH_MOUSE_LL, mouseEventHookFn, thisModule, 0 );
钩子函数如下所示:
RESULT CALLBACK mouseEventHookFn( int code, WPARAM wParam, LPARAM lParam )
{
if ( code == HC_ACTION ) {
PMSLLHOOKSTRUCT mi = (PMSLLHOOKSTRUCT)lParam;
// .. do interesting stuff ..
}
return ::CallNextHookEx( mouseEventHook, code, wParam, lParam );
}
现在,我的问题是我无法控制“做有趣的事情”部分究竟需要多长时间。特别是,它可能需要比 Windows 注册表中定义的 LowLevelHooksTimeout 更长的时间。这意味着,至少在 Windows XP 上,系统不再将鼠标事件传递给我的钩子函数。我想避免这种情况,但同时我需要在目标 GUI 接收事件之前发生“做有趣的事情”部分。
我试图通过在一个单独的线程中做“有趣的东西”工作来解决这个问题,这样mouseEventHookFn
上面就可以向工作线程发布一条消息,然后return 1;
立即执行一个(这会结束钩子函数但避免将事件传递给 GUI )。这个想法是工作线程在完成后CallNextHookEx
自己执行调用。
但是,这会导致内部崩溃CallNextHookEx
(实际上,崩溃发生在名为 的内部函数内部PhkNextValid
。我认为从挂钩函数外部调用是不安全的CallNextHookEx
,这是真的吗?
如果是这样,是否有其他人知道我如何在 GUI 接收事件之前运行代码(需要与应用程序的 GUI 线程交互)并避免我的钩子函数阻塞太久?