0

我在这个领域做了一些研究(通过单个输入设备),发现在大多数情况下,消息是成对发送的,首先是 WM_INPUT,然后是 WM_KEYDOWN。因此,只能将它们链接在一起进行过滤,即 WM_INPUT 标志它对应的 WM_KEYDOWN 不应发送给接收者(在我的情况下,首先我丢弃所有 WM_KEYDOWN 然后决定何时需要将它们发送回他们的收件人)。我只是假设所有下一个 WM_KEYDOWN 都属于最后一个 WM_INPUT。

我的问题正是:我可以认真地依赖这个原则吗?如果我使用多个输入设备,这些消息不会混淆吗?

关于它的可靠性已经存在一些严重的问题: 1. 我如何区分来自多个设备的重复输入(答案很明显 - 我不能)。2. 如果来自多个设备的输入,WM_INPUT-WM_KEYDOWN 对会混淆吗?即形成一个像WM_INPUT、WM_INPUT、WM_KEYDOWN、WM_KEYDOWN这样的队伍?

另外也许可以丢弃所有 WM_KEYDOWN 并自己生成所有键盘事件?尽管这在技术上是相当困难的,因为一个 WM_INPUT 可能有多个 WM_KEYDOWN(键重复以这种方式工作,多个 WM_KEYDOWN,一个 WM_KEYUP)。

以防万一,这就是我需要实现的目标:我需要按时间过滤所有消息。所有用户输入都按按键之间的时间间隔过滤。如果以 <50ms 的间隔发送了两条消息,我将丢弃第一条消息并在其 TTL 超过时等待第二条消息,如果是,则将其发送给其收件人。困难在于可以有多个输入设备,并且这些时间会相互混淆。

4

2 回答 2

0

我了解您的问题有多个设备并且事情变得一团糟。

每个设备都有不同的产品和供应商 ID,所以我建议是根据他们的产品和供应商 ID 来区分它们。

我最近一直在研究 HID 设备,所以这也可能对您有所帮助。

于 2012-11-06T11:09:16.673 回答
0

我发现键盘钩子(WH_KEYBOARD)实际上发生在 WM_KEYDOWN 消息之前,无法检查来自多个设备的同时输入是否会打乱 WM_INPUTS 和 KeyboardHook 事件的顺序(如事件序列:Dev0_WM_INPUT Dev1_WM_INPUT Dev0_KBDHook Dev1_KBDHook - altrough 该事件序列将被处理,我担心的是 Dev1_KBDhook 是否会出现在 Dev0_KBDhook 之前或更糟)。

使用 WM_KEYDOWN 这样的混乱是可能的,仍然不知道它是否会与键盘挂钩相同。

无论如何,这是可能的解决方案。在 WM_INPUT 我创建 Message 本身并部分填充,在下一个 KeyboardHookEvent 上我只填充剩余部分。

通常 WM_INPUTs 和 KeyboardHook 事件成对发生,但正如我之前提到的,我不完全知道它是否会搞砸,但即使这样,它是否会保持 KeyboardHookEvents 和 WM_INPUTS 的顺序(如 Dev0_INPUT、Dev1_INPUT 和 Dev0_KBDEvent, Dev1_KBDEvent)它不会给解析这些序列带来麻烦。例如一个堆栈:WM_INPUT 推送新消息结构,KBDEvent 弹出并填充剩余部分。

通常不是很好的解决方案,但我想如果没有其他解决方案就足够了,至少可以部分解决问题。

如果我能够在来自多个设备的同时输入时测试其行为,我将在此处发布信息。尽管我真的怀疑会有任何无法处理的混乱。除非windows随机选择时间发送相应的键盘事件...

忘了提,是的,部分可能丢弃所有输入并手动生成。我只是 PostMessage 手动伪造消息(我从 KeyboardHookEvent 获得 lparam)。但是会带来一些问题。像热键和任何使用 GetAsyncKeyState 的东西都不起作用。就我而言,这是可以接受的。

于 2012-11-06T12:33:12.517 回答