在 WM_INPUT 消息中寻找重复键数据
Looking for key-repeat data in WM_INPUT message
我刚开始为我的应用程序使用原始输入。
直奔问题,在遗留 WM_KEYDOWN
消息中,可以检查 lParam
以获得有关按键的额外信息。喜欢这些-
Bits Meaning
0-15 The repeat count for the current message.
The value is the number of times the keystroke is autorepeated as a
result of the user holding down the key. If the keystroke is
held long enough, multiple messages are sent. However, the repeat
count is not cumulative.
16-23 The scan code. The value depends on the OEM.
24 Indicates whether the key is an extended key, such as the right-hand
ALT and CTRL keys that appear on an enhanced 101- or 102-key
keyboard. The value is 1 if it is an extended key; otherwise, it is
0.
25-28 Reserved; do not use.
29 The context code. The value is always 0 for a WM_KEYDOWN message.
30 The previous key state. The value is 1 if the key is down before the
message is sent, or it is zero if the key is up.
31 The transition state. The value is always 0 for a WM_KEYDOWN
message.
我想知道 WM_INPUT
消息是否针对重复键,以便我可以忽略该消息。(关闭键重复。)
我遇到的麻烦是无法找到 WM_INPUT
消息的此信息。 WM_INPUT
消息的 lParam
包含 RAWINPUT
结构的句柄。在做一些研究时,我发现 RAWINPUT::header
中包含一个名为 wparam 的成员,MSDN 将其描述为
wParam
Type: WPARAM
The value passed in the wParam
parameter of the WM_INPUT
message.
我会在这里找到所需的信息还是在其他地方?
RAW 输入 API 不提供重复计数。它是 raw 直接来自键盘的数据。当生成 WM_KEY...
消息时,将在更高级别计算重复计数。使用 WM_INPUT
,您将不得不手动跟踪每个键的 down/up 状态,以自行确定它们的重复计数。当一个键关闭时,开始计算该键的每个 WM_INPUT
消息。当键上升时,停止计数。
我需要的信息与您正在寻找的信息相同,而且我找到了一个合理的解决方法。我不关心按键重复次数,我只是想知道 WM_INPUT
消息是否代表自动重复 ,即使在我的应用程序运行时发生了初始按键焦点不在焦点上,当焦点切换到我的应用程序时,键继续按住。
除了第一个 WM_INPUT
消息之外的所有消息都不足以辨别这一点,因为在获得焦点之前按住的键在获得焦点之后看起来像是新的键事件。您需要 WM_KEYDOWN
/WM_SYSKEYDOWN
lparam 位 30 中的信息,但显然无法从 WM_INPUT
.
中获得
我们通过省略 RIDEV_NOLEGACY
标志注册原始输入时请求继续接收遗留输入消息来解决此问题。我们得到原始消息和遗留消息,它们交错到达。对于包含密钥信息的任何相关 WM_INPUT
消息,在任何其他 WM_INPUT
消息到达之前,它后面将跟有与该密钥相关的旧消息。我们的 Windows 输入库在评估关键事件之前从原始消息和遗留消息中收集关键信息,这对我们来说非常有效。
我刚开始为我的应用程序使用原始输入。
直奔问题,在遗留 WM_KEYDOWN
消息中,可以检查 lParam
以获得有关按键的额外信息。喜欢这些-
Bits Meaning
0-15 The repeat count for the current message.
The value is the number of times the keystroke is autorepeated as a
result of the user holding down the key. If the keystroke is
held long enough, multiple messages are sent. However, the repeat
count is not cumulative.
16-23 The scan code. The value depends on the OEM.
24 Indicates whether the key is an extended key, such as the right-hand
ALT and CTRL keys that appear on an enhanced 101- or 102-key
keyboard. The value is 1 if it is an extended key; otherwise, it is
0.
25-28 Reserved; do not use.
29 The context code. The value is always 0 for a WM_KEYDOWN message.
30 The previous key state. The value is 1 if the key is down before the
message is sent, or it is zero if the key is up.
31 The transition state. The value is always 0 for a WM_KEYDOWN
message.
我想知道 WM_INPUT
消息是否针对重复键,以便我可以忽略该消息。(关闭键重复。)
我遇到的麻烦是无法找到 WM_INPUT
消息的此信息。 WM_INPUT
消息的 lParam
包含 RAWINPUT
结构的句柄。在做一些研究时,我发现 RAWINPUT::header
中包含一个名为 wparam 的成员,MSDN 将其描述为
wParam
Type:WPARAM
The value passed in thewParam
parameter of theWM_INPUT
message.
我会在这里找到所需的信息还是在其他地方?
RAW 输入 API 不提供重复计数。它是 raw 直接来自键盘的数据。当生成 WM_KEY...
消息时,将在更高级别计算重复计数。使用 WM_INPUT
,您将不得不手动跟踪每个键的 down/up 状态,以自行确定它们的重复计数。当一个键关闭时,开始计算该键的每个 WM_INPUT
消息。当键上升时,停止计数。
我需要的信息与您正在寻找的信息相同,而且我找到了一个合理的解决方法。我不关心按键重复次数,我只是想知道 WM_INPUT
消息是否代表自动重复 ,即使在我的应用程序运行时发生了初始按键焦点不在焦点上,当焦点切换到我的应用程序时,键继续按住。
除了第一个 WM_INPUT
消息之外的所有消息都不足以辨别这一点,因为在获得焦点之前按住的键在获得焦点之后看起来像是新的键事件。您需要 WM_KEYDOWN
/WM_SYSKEYDOWN
lparam 位 30 中的信息,但显然无法从 WM_INPUT
.
我们通过省略 RIDEV_NOLEGACY
标志注册原始输入时请求继续接收遗留输入消息来解决此问题。我们得到原始消息和遗留消息,它们交错到达。对于包含密钥信息的任何相关 WM_INPUT
消息,在任何其他 WM_INPUT
消息到达之前,它后面将跟有与该密钥相关的旧消息。我们的 Windows 输入库在评估关键事件之前从原始消息和遗留消息中收集关键信息,这对我们来说非常有效。