我刚刚开始为我的应用使用Raw Input。
直接回答问题,在遗留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
消息是否用于重复键,以便我可以忽略该消息。(关闭keyrepeat。)
我遇到的麻烦是找不到WM_INPUT
消息的这些信息。 lParam
消息的WM_INPUT
包含RAWINPUT
结构的句柄。在进行一些研究时,我发现里面RAWINPUT::header
包含一个名为wparam的成员,MSDN将其描述为
wParam
输入:WPARAM
在wParam
消息的WM_INPUT
参数中传递的值。
我会在这里找到所需的信息还是在其他地方?
答案 0 :(得分:5)
RAW输入API不提供重复计数。它是直接来自键盘的原始数据。生成WM_KEY...
消息时,将在更高级别计算重复计数。使用WM_INPUT
,您必须手动跟踪每个键的向下/向上状态,以确定自己的重复计数。当密钥关闭时,开始计算该密钥的每条WM_INPUT
消息。当键上升时,停止计数。
答案 1 :(得分:2)
我需要您正在寻找的相同信息,我找到了合理的解决方法。我不关心密钥重复计数,我只是想知道WM_INPUT
消息是否代表自动重复 ,即使在我的应用程序未处于焦点位置时发生了初始按键操作当焦点切换到我的应用程序时,密钥继续保持。
除了第一个WM_INPUT
消息之外的所有消息都不足以辨别这一点,因为在获得焦点之前保持的键在获得焦点后看起来像新的键事件。您需要WM_KEYDOWN
/ WM_SYSKEYDOWN
lparam位30中的信息,而WM_INPUT
显然无法提供这些信息。
我们通过省略RIDEV_NOLEGACY
标志来请求在注册原始输入时继续接收传统输入消息来解决此问题。我们得到原始和遗留消息,它们交错到达。对于包含关键信息的任何相关WM_INPUT
消息,在任何其他WM_INPUT
消息到达之前,将跟随与该密钥相关的旧消息。我们的Windows输入库收集来自raw和amp;的关键信息。评估关键事件之前的遗留消息,它对我们非常有用。