我正在为条形码扫描仪制作一个"驱动程序"。
这个特殊的扫描仪基本上是一个USB键盘,每当扫描到某个东西时就会产生按键。
我想找到一种方法来区分这些击键和正确键盘发送的击键。不幸的是,唯一的区别是扫描仪生成按键的速度真的很快,在几分之一秒内生成一堆按键。
在我看来,我必须设置一个全局键盘挂钩,它可以拦截所有输入,以某种方式存储它,等待一小段时间,然后将这些击键进一步发送到挂钩链中,或者假设它们是扫描仪生成并适当处理的。
然而,由于没有钩子的经验,我不确定正确的方法。我可以在其他线程中调用KeyboardProc()
以外的其他方法中的CallNextHookEx()
来传递延迟的击键事件吗?还是应该手动生成一条新的WM_KEYPRESS
消息?也许有更好的方法来处理这件事?
谢谢。
好的,这是我的解决方案,以防有人遇到类似的问题。
首先,使用WH_KEYBOARD_LL
钩子而不是WH_KEYBOARD
。
第二,使用SendInput()
API函数将不需要的击键传递到活动窗口。
第三,低级键盘挂钩的回调函数有一个指向KBDLLHOOKSTRUCT
的指针作为参数之一;在其flags
位字段中使用LLKHF_INJECTED
位来区分真实的击键和您刚刚生成的击键。如果你有妄想症,担心其他人可能也在耍同样的把戏,请使用SendInput()
和钩子回调使用的结构的dwExtraInfo
成员来区分自己和其他人输入的击键。
第四,要注意,如果处理输入的时间太长,Windows7往往会悄悄地解除低级别钩子的挂钩,所以要么保持钩子回调尽可能简单,要么确保在挂钩的线程中尽可能频繁地泵送Windows消息队列;或者——如果你是一个坏孩子——HKCUControl PanelDesktop[DWORD]LowLevelHooksTimeout
有一个注册表项,将其设置为一个相当大的值也可以。