其他分享
首页 > 其他分享> > CW-未调用WH_KEYBOARD_LL挂钩

CW-未调用WH_KEYBOARD_LL挂钩

作者:互联网

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

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

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

这是设置钩子的方法:

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

有没有人经历过?

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

解决方法:

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

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

标签:c,visual-c,winapi,hook,c-2
来源: https://codeday.me/bug/20191013/1910426.html