【发布时间】:2014-08-22 15:05:46
【问题描述】:
我遇到了键盘记录器的问题。直到今天测试的每个系统都运行良好,除了一个 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 专业版上开发该应用程序,它看起来也很好。 我想知道这是我的应用程序的问题,还是我无法控制的问题。
感谢大家的帮助。
【问题讨论】:
-
从给定的签名来看,看起来你的钩子过程是一个类中的 member 函数。那不应该奏效。如果它是在类中定义的,它必须是一个静态函数。我假设您只是忽略了复制和粘贴
static修饰符?除此之外,这个问题的通常原因是在钩子过程中做了太多的工作。你没有向我们展示它包含的任何代码,所以我们只能猜测。不过,当然应该在其他系统上引起问题。无论如何,我都不是嵌入式 Windows 方面的专家。很难想象有什么不同。 -
我粘贴了 .cpp 文件中的代码。但是,是的,这是一个静态方法,这是标题中的定义。
static LRESULT CALLBACK keyboardProcedure(int nCode, WPARAM wParam, LPARAM lParam);。我只粘贴了解决问题所需的基本内容,我计算了一个小型构建,回调的内容相对较小,问题仍然存在,因此回调中的细节无关紧要。不过感谢您的关注
标签: c++ qt keyboard qt5 setwindowshookex