0

我有一个 WH_GETMESSAGE 钩子可以捕获 WM_KEYDOWN 和 WM_INPUT(现在只有 WM_KEYDOWN),我需要一种方法来测量 WM_KEYDOWN 之间的时间间隔,以查看用户输入的速度。如果输入太快,我确实需要放弃整个击键(即输入实际上不是来自用户,而是来自某些 HID 键盘设备,如条形码扫描仪)。我需要做的是对于每个符号,我将等待 30 毫秒,然后如果没有应用其他符号,我需要将它发送到它的意思的窗口。并且需要对每个 WM_KEYDOWN 执行该检查。如果应用了新符号,我会将其与任何其他符号一起推送到我的队列中,这些符号将在消息之间的 30 毫秒限制内进行(实际上我在我的计算机上进行了测试,输入符号需要 31-32 毫秒,条形码扫描仪需要 15 -16 毫秒就足够了)。

我想出了以下算法: 1. 如果传入消息是 WM_KEYDOWN - 存储它(有时间偏离)。2. 如果下一条传入消息不是 WM_KEYDOWN 或超过时间限制 - 将存储的消息发送给它的收件人,如果它是 WM_KEYDOWN 则存储当前消息 - 转到步骤 1。 3. 如果下一条消息在 30 毫秒限制内到达 - 也存储它。4. 如果下一条消息是 VK_RETURN 或序列长于 128 个符号 - 删除当前序列并将其存储为条形码。转到步骤 1。

该算法的当前缺陷是 sendMessage 的事情。我同时使用了 sendMessage 和 postMessage 但他们都只是将它重新发送到我的钩子程序(我猜这很明显)。有什么方法可以将此消息直接发送到要发送的窗口?

或者也许有其他解决方案可以解决我的问题?

我的解释可能看起来模棱两可,所以我只写我需要实现的内容:我需要在条形码扫描仪输入实际到达窗口过程之前拦截它,因此来自扫描仪的 WM_KEYDOWN 消息不会到达目标窗口。条码消息通常在单个 WM_KEYDOWN 之间有 15-16 毫秒的间隔,并以 VK_RETURN 结束。

我还需要准确地使用 WH_GETMESSAGE(或类似的钩子,它可以让我同时捕获 WM_INPUT 和 WM_KEYDOWN)。需要 WM_INPUT 来区分来自各种设备的输入(基本上我将枚举所有 HID 键盘,确定它们中的哪些发送条形码,如果发生此类事件,我会将设备标记为条形码扫描仪并将其 VID 和 PID 存储到本地数据库,它将被使用对于他人)。

4

0 回答 0