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

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

钩子(Hook)函数位于dll中,该dll在应用程序启动时加载,并且钩子(Hook)也在启动时从主线程进行设置。这很完美。当我需要停用挂钩并将其重新激活时,会出现问题。如果我从应用程序的主线程执行此操作,则可以正常工作,但我需要的是从计时器执行此操作,这会出错。我使用计时器来检查我的应用程序的窗口是否为前台窗口( Activity 窗口),如果是,则挂钩被激活,如果不是,则挂钩被停用。从计时器调用时SetWindowsHookEx的返回值始终是确定的(不是null),根据MSDN,这意味着该挂钩已成功设置,但我的挂钩函数从未被调用。

这是设置钩子(Hook)的方法:

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

有没有人经历过?

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

最佳答案

挂钩回调是在与调用SetWindowsHookEx()相同的线程上进行的。魔术需要该线程来发送消息循环。麻烦的是,您的计时器回调方法是从线程池线程中调用的。它不会启动,它的时间还不够长,无法获得钩子(Hook)回调。

调用您的UI线程或使用同步计时器。或者考虑暂时禁用钩子(Hook)回调中的所有操作,而不是完全禁用或替换钩子(Hook),这当然是最有意义的。

关于c# - WH_KEYBOARD_LL Hook 未调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5050959/

10-11 23:02
查看更多