没有调用WH_KEYBOARD_LL挂钩

x3r*_*5d4 1 c# c++ hook winapi visual-c++

我遇到WH_KEYBOARD_LL钩子有些问题:

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

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

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

SetWindowsHookEx(WH_KEYBOARD_LL, keyboardHookProcedure,
                 GetModuleHandle(curModule.ModuleName), 0);
Run Code Online (Sandbox Code Playgroud)

有没有人经历过这个?

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

Han*_*ant 6

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

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