SetWindowsHookEx在快速输入或键盘按钮保持时冻结

时间:2014-08-22 15:05:47

标签: c++ qt keyboard qt5 setwindowshookex

我遇到键盘记录器问题。直到今天测试的每个系统都运行良好,除了 Windows 7 Embedded Standard 32位,显然对当前版本感到不满。

我需要做的是记录键盘输入的击键,直到我得到一定数量的击键。当我这样做时,我会打电话给某个程序。

我有一个像这样定义的钩子:

SetWindowsHookEx(WH_KEYBOARD_LL, keyboardProcedure, GetModuleHandle(NULL), 0);

和keyboardProcedure回调:

LRESULT CALLBACK SystemKeyboardReadWrite::keyboardProcedure(int nCode, WPARAM wParam, LPARAM lParam)
{
   ... 
}

我在这个应用程序中使用Qt 5.2。

因此,更深入地说,当您输入键太快或者按住某个键较长时间时会出现问题,这将迫使键盘发送多个键盘事件。当发生这种情况时,挂钩将冻结,不再向回调发送任何事件。 (不是整个应用程序,应用程序仍将继续运行,但键盘记录器除外)

仅在此操作系统上出现此问题,在其他Windows 7操作系统或Windows XP上我没有注意到此问题。我有2台计算机具有相同的设置,他们都显示相同的问题,我也正在开发Windows 7专业版的应用程序,它似乎也很好。 我想知道这是我的应用程序的问题,还是我无法控制的事情。

感谢大家的帮助。

1 个答案:

答案 0 :(得分:2)

我不了解Windows Embedded,但我熟悉Windows 7和LowLevel Hooks,包括鼠标和键盘。

可以使用LowLevelHooksTimeOut注册表值减少/修改从钩子列表中踢出的症状。修改后必须重新启动系统。基本上该值表示挂钩必须与键交互的毫秒数。

如果您也在钩子方法中编写文件,那也可能是超时的确切时间。

例如,您获得100次击键,然后将其写入文件。如果他们按下100到101+之间的键,并且你花费的时间超过钩子的最大时间,那么Windows会将你的钩子回调黑名单并将你从钩子列表中删除。

我认为Windows 7(桌面版)上的默认时间是200毫秒。对于嵌入式内容,如果它更少,我不会感到惊讶。此外,当多个程序都挂钩键盘时,它会影响允许挂钩访问它的时间。

我也只使用了在dll中建立的钩子,并保留了一个全局HHOOK句柄。查看功能的所有返回代码也可以了解情况。

有关LowLevelHooksTimeout的更多信息:

Low level Keyboard Hook works on one on Windows 7 x64 and not another