在WM_INPUT消息中查找密钥重复数据

时间:2015-09-19 04:29:19

标签: c++ winapi keyboard raw-input

我刚刚开始为我的应用使用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参数中传递的值。

我会在这里找到所需的信息还是在其他地方?

2 个答案:

答案 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;的关键信息。评估关键事件之前的遗留消息,它对我们非常有用。