关于低级钩子失灵原因:
https://blog.csdn.net/matrix_designer/article/details/5893669
Windows要求低级钩子必须在限定的时间内完成,如果超时系统就会自动调用钩子链的下一个函数。这个超时值是由HKEY_CURRENT_USER/Control Panel/Desktop下的键LowLevelHooksTimeout决定的。如果没有这个键,系统在一次超时后就会自动卸载钩子,以后钩子函数就再也得不到执行。默认情况下,XP有这个键,其值为5000(五秒钟);Vista和Win7都没有这个键,因而一旦超时钩子就会被卸载。
--------------------------------------------------------------------------------
我测试过,如果在钩子回调函数(比如:keyboardHook())中调用了一段比较耗时的代码后,就算设置了 LowLevelHooksTimeout 可能也没用。
我的解决办法:
把耗时的代码放在另一个线程中去完成,可能需要队列模式,比如在 keyboardHook() 中把耗时的代码放到另一个线程的处理队列中,随后马上返回 --> return CallNextHookEx(...)
这样低级钩子才不会出现用着用着就失灵了现象。