我目前正在编写一个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毫秒只捕获一个键,即使我在其间按下许多键也是如此 .
1 回答
该问题由documentation涵盖,其中规定:
因此,您的主应用程序将仅接收键盘通知,因为安装挂钩的线程可以从挂钩轮询其消息队列以获取新消息 . 如果您减慢轮询速度,您的通知会延迟 .
文件还说明:
所以你应该考虑使用它 .