c++ - SetWindowsHookEx 在快速输入或按住键盘按钮时卡住

标签 c++ qt keyboard qt5 setwindowshookex

我的键盘记录器出现问题。直到今天测试的每个系统都工作正常,除了 Windows 7 Embedded Standard 32 位,它显然对当前的构建感到 panic 。

我需要做的是记录从键盘输入的击键,直到获得一定数量的击键。当我这样做时,我会调用某个过程。

我有一个这样定义的钩子(Hook):

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

和一个keyboardProcedure回调:

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

我在此应用程序中使用 Qt 5.2。

所以,更深入地讲,当你输入按键太快或按住某个键较长时间时,就会出现问题,这会迫使键盘发送多个键盘事件。当发生这种情况时, Hook 将卡住并且不再向回调发送任何事件。 (不是整个应用程序,应用程序仍将继续运行,键盘记录器除外)

此问题仅发生在该操作系统上,在其他 Windows 7 操作系统或 Windows XP 上我没有注意到该问题。我有两台具有相同设置的计算机,它们都显示了相同的问题,而且我正在 Windows 7 Professional 上开发该应用程序,看起来也很好。 我想知道这是否是我的应用程序的问题,或者是否超出了我的控制范围。

感谢大家的帮助。

最佳答案

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

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

如果您也从钩子(Hook)方法内部写入文件,那么这也可能是超时的确切时间。

例如,您获得 100 个击键,然后将其写入文件。如果他们按住 100 到 101+ 的按键,并且您使用 Hook 的时间超过了最大时间,那么 Windows 会将您的 Hook 回调列入黑名单,并将您从 Hook 列表中踢出。

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

我也只真正使用过在 dll 中建立的钩子(Hook),并保留全局 HHOOK 句柄。观察函数的所有返回码也可能有助于了解情况。

有关 LowLevelHooksTimeout 的更多信息:

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

关于c++ - SetWindowsHookEx 在快速输入或按住键盘按钮时卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25450168/

相关文章:

c++ - 链接失败,并带有对libboost_thread的 undefined reference

python - gdb python模块读取内存内容

qt - QSettings clear,有什么作用?

assembly - 如何在裸机ARM组装中使用键盘?

macos - 使用 CFEvents 从 Mac 中的守护程序执行键盘事件

python - Pybind11 函数调用阻塞主线程

c++ - size_t 和 ptrdiff_t 类型的变量

c++ - 对已定义接口(interface)析构函数的 undefined reference

android - 使用 Qt Creator 4.3.1/Android Studio 2.3.3 为 Android 目标构建 Qt 应用程序时出错

android - AnySoftKeyboard 在我隐藏它之后保留垃圾数据