【发布时间】:2014-08-21 10:50:28
【问题描述】:
我目前正在用 C 编写一个需要跟踪按键和释放的库。为了达到最佳效果,我使用了一个low level keyboard hook,它调用一个回调函数来处理这些关键事件。
我遇到的问题是按键似乎被延迟了。我的程序循环执行得越慢,关键事件到达所需的时间就越长。我的回调函数将所有按下的键存储在一个数组中,稍后我可以从中轮询它们。如果程序会延迟一秒钟,那么当我之后检查它时,我希望所有关键事件都在数组中。不是这样的,这种情况下好像只存储了一个事件,剩下的在后面来。
我的回调函数如下,不相关的部分总结如下:
static LRESULT CALLBACK llKeyProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if(nCode == HC_ACTION) {
//The keys are processed and stored in an array to be polled by the user in the future
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
钩子附加到进程(_window->llKeyHook是HHOOK类型):
_window->llKeyHook = SetWindowsHookEx(WH_KEYBOARD_LL, llKeyProc, NULL, 0);
在我的主循环中轮询关键事件。此循环的帧速率当前受到每次迭代后调用 Sleep(ms) 的限制。睡眠时间的长短由主循环的执行速度决定。当我将其设置为较高的值(如 300 毫秒)时,每 300 毫秒仅捕获一个键,即使我在其间按下了许多键。
【问题讨论】:
-
从您链接到的文档中:“调用是通过向安装挂钩的线程发送消息来进行的。因此,安装挂钩的线程必须具有消息循环。”所以你描述的行为完全符合预期。你不应该在你的消息循环中睡觉。
标签: c winapi keyboard hook delay