带有延迟的全局键盘挂钩



我正在为条形码扫描仪制作一个"驱动程序"。

这个特殊的扫描仪基本上是一个USB键盘,每当扫描到某个东西时就会产生按键。

我想找到一种方法来区分这些击键和正确键盘发送的击键。不幸的是,唯一的区别是扫描仪生成按键的速度真的很快,在几分之一秒内生成一堆按键。

在我看来,我必须设置一个全局键盘挂钩,它可以拦截所有输入,以某种方式存储它,等待一小段时间,然后将这些击键进一步发送到挂钩链中,或者假设它们是扫描仪生成并适当处理的。

然而,由于没有钩子的经验,我不确定正确的方法。我可以在其他线程中调用KeyboardProc()以外的其他方法中的CallNextHookEx()来传递延迟的击键事件吗?还是应该手动生成一条新的WM_KEYPRESS消息?也许有更好的方法来处理这件事?

谢谢。

好的,这是我的解决方案,以防有人遇到类似的问题。

首先,使用WH_KEYBOARD_LL钩子而不是WH_KEYBOARD

第二,使用SendInput()API函数将不需要的击键传递到活动窗口。

第三,低级键盘挂钩的回调函数有一个指向KBDLLHOOKSTRUCT的指针作为参数之一;在其flags位字段中使用LLKHF_INJECTED位来区分真实的击键和您刚刚生成的击键。如果你有妄想症,担心其他人可能也在耍同样的把戏,请使用SendInput()和钩子回调使用的结构的dwExtraInfo成员来区分自己和其他人输入的击键。

第四,要注意,如果处理输入的时间太长,Windows7往往会悄悄地解除低级别钩子的挂钩,所以要么保持钩子回调尽可能简单,要么确保在挂钩的线程中尽可能频繁地泵送Windows消息队列;或者——如果你是一个坏孩子——HKCUControl PanelDesktop[DWORD]LowLevelHooksTimeout有一个注册表项,将其设置为一个相当大的值也可以。

最新更新