【问题标题】:A global keyboard hook with a delay一个有延迟的全局键盘钩子
【发布时间】:2012-10-25 15:47:19
【问题描述】:

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

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

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

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

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

谢谢。

【问题讨论】:

  • 这个和this question基本一样。不幸的是,答案只有一半。
  • 这个答案应该可以解决你的问题:stackoverflow.com/a/3060668/886887
  • @HarryJohnston 不幸的是,应该存在我似乎需要支持的键盘/卡片扫描仪组合之类的东西;它注册为单个设备,但同时发送常规键盘输入和扫描代码作为无法区分的击键:(

标签: windows winapi


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-26
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多