2

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

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

我想找到一种方法来区分这些击键和正确的键盘发送的那些击键。不幸的是,唯一的区别是扫描仪生成击键的速度非常快,在几分之一秒内就可以完成一系列按键操作和按键操作。

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

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

谢谢。

4

1 回答 1

4

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

首先,使用WH_KEYBOARD_LLhook 而不是WH_KEYBOARD.

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

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

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

于 2012-10-25T07:47:19.570 回答