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