带有延迟的全局键盘钩子

时间:2012-10-16 13:26:31

标签: windows winapi

我正在为条形码扫描仪制作“驱动程序”。

这种特殊的扫描仪基本上是一个USB键盘,无论何时扫描某些东西都会产生击键。

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

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

然而,由于没有钩子的经验,我不确定正确的做法。我是否可以在某些其他线程中以CallNextHookEx()之外的某种方法调用KeyboardProc()来传递延迟的击键事件?或者我应该手动生成新的WM_KEYPRESS消息?也许有更好的方法可以解决这个问题?

感谢。

1 个答案:

答案 0 :(得分:3)

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

首先,使用WH_KEYBOARD_LL挂钩代替WH_KEYBOARD

其次,使用SendInput() API函数将您不需要的击键传递给活动窗口。

第三,低级键盘钩子的回调函数有一个指向KBDLLHOOKSTRUCT的指针作为参数之一;在LLKHF_INJECTED位域中使用flags位来区分真正的击键和刚刚生成的击键。如果你是偏执狂并担心其他人可能会采用相同的技巧,请使用结构的dwExtraInfo成员SendInput()并使用钩子回调来区分由你自己和其他人注入的击键。 / p>

第四,请注意,如果处理输入所需的时间太长,Windows 7会默默地取消挂钩低级挂钩,因此要么保持挂钩回调简单且可能,并确保经常抽取Windows消息队列尽可能在挂钩的线程中;或者 - 如果你是一个坏孩子 - 在HKCU\Control Panel\Desktop\[DWORD]LowLevelHooksTimeout有一个注册表项,将其设置为一个相当大的值也可能有效。