2012-10-16 79 views
2

我正在为条码扫描器制作“驱动程序”。延迟的全局键盘钩

这个特定的扫描仪基本上是一个USB键盘,只要扫描了某物就会产生键击。

我想找到一种方法来区分这些击键与正确键盘发送的击键。不幸的是,唯一不同的是,扫描仪在几分之一秒内快速地产生键盘输入和密钥。

我看到它的方式是我必须建立一个全局键盘钩子,拦截所有输入,以某种方式存储它,等待一小会儿,然后将这些键击发送到钩子链或者假设它们是扫描器生成并适当地处理它们。

但是,由于没有使用钩子的经验,我不确定正确的做法。我可以在KeyboardProc()之外的其他某个线程中使用CallNextHookEx()来传递延迟按键事件吗?或者我应该手动生成一个新的WM_KEYPRESS消息?也许有更好的方法去做这件事?

谢谢。

+0

这与[此问题]基本相同(http://stackoverflow.com/questions/12885897/block-keystrokes-from-a-specific-keyboard)。不幸的是,只有一半的答案。 – arx

+0

这个答案应该可以解决你的问题:http://stackoverflow.com/a/3060668/886887 –

+0

@HarryJohnston它应该,不幸的是存在这样的事情,我似乎需要支持键盘/卡扫描仪组合;它注册为一个单一的设备,但同时发送常规键盘输入和扫描代码作为难以区分的击键: – obamator

回答

3

好的,这是我遇到类似问题时的解决方案。

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

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

三,低级键盘挂钩的回调函数有一个指向KBDLLHOOKSTRUCT的指针作为参数之一;在其flags位字段中使用LLKHF_INJECTED位来区分真正的按键和您刚刚生成的按键。如果您偏执,并害怕别人可能会采取同样的方法,请使用SendInput()结构中的dwExtraInfo成员和钩子回调函数来区分由您和其他人注入的击键。

第四,请注意,如果Windows 7处理输入需要很长时间,则会倾向于默默解除低级挂钩,因此要么将挂钩回调保持为简单且可能,并且确保将Windows消息队列作为在钩住钩子的线程中经常尽可能多;或者 - 如果你是一个不好的坏男孩 - 在HKCU\Control Panel\Desktop\[DWORD]LowLevelHooksTimeout有一个注册表项,将它设置为相当大的值也可能工作。