没有调用WH_KEYBOARD_LL挂钩

我在使用WH_KEYBOARD_LL钩子时遇到了一些问题:

我使用全局LL钩子的原因并不重要我只需要它为我的应用程序(我尝试了其他类型的钩子,但它们对我不起作用)。

钩子函数在一个dll中,dll在应用程序启动时加载,钩子也在主线程启动时设置。 这非常有效。 当我需要停用挂钩并重新激活它时,会出现问题。 如果我从应用程序的主线程执行此操作它可以正常工作,但我需要的是从计时器执行此操作,这里出了问题。 我使用计时器来检查我的应用程序的窗口是否是前台窗口(活动窗口),如果是,则挂钩被激活,如果不是,则挂钩被停用。 从计时器调用时SetWindowsHookEx的返回值总是ok(非null),根据MSDN,这意味着钩子已成功设置,但我的钩子函数永远不会被调用。

以下是我设置钩子的方法:

 SetWindowsHookEx(WH_KEYBOARD_LL, keyboardHookProcedure, GetModuleHandle(curModule.ModuleName), 0); 

有没有人经历过这个?

我唯一的猜测是我的钩子函数在一个DLL中,而计时器回调来自另一个dll,这与我的问题有什么关系吗?

钩子回调是在调用SetWindowsHookEx()的同一个线程上进行的。 这一点魔法需要该线程泵送消息循环。 哪个是摩擦,你的计时器回调方法是从线程池线程调用的。 它没有泵,它甚至不能长到能够获得钩子回调。

调用UI线程或使用同步计时器。 或者考虑暂时禁用你在钩子回调中做的任何事情,而不是完全禁用或替换钩子,这当然是最有意义的。

为了它的价值,我在我的代码中使用GetModuleHandle(0)来设置SetWindowsHookEx。 我不知道这是不是你的问题 – 我的代码是单线程的。

您可以检查钩子函数中的前景窗口,并完全摆脱计时器线程。 这就是我在TouchCursor中所做的。 您可以在SourceForge – Line 553 上查看我的代码以获取钩子函数。