繁体   English   中英

WH_KEYBOARD_LL挂钩未调用

[英]WH_KEYBOARD_LL hook not called

我在WH_KEYBOARD_LL挂钩上遇到了一些问题:

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

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

这是设置钩子的方法:

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

有没有人经历过?

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

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

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

对于它的价值,我在代码中为SetWindowsHookEx使用GetModuleHandle(0) 我不知道这是否是您的问题-我的代码是单线程的。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM