Windows 键重复设置影响原始输入消息

Windows key repeat settings affecting Raw Input messages

它应该是直接从设备输入的 RAW,奇怪的是它受这些设置的影响:

在延迟之后才会收到 WM_INPUT 消息。重复率也在影响它。我也试过用 NO_LEGACY 标志注册原始输入设备,没有区别。这是我遇到这个问题的 DirectX11 应用程序。

case WM_INPUT: {Input::handleInput(uMsg, wParam, lParam); break; }

显然没有办法绕过它,gamedev 教程解释说你只需要在你的代码中用你自己复杂的解决方法来处理它。原始输入我的 a$se Microsoft。

当你按住一个键时会发生什么WM_INPUT会发送一个按键消息,等到Windows"key repeat delay"已经过去,然后继续发送按键消息Windows "key repeat speed" 设置。

我发现使用 keyboard.flags 成员而不是使用 Makecode 或 Vkey 成员更容易,因为(对于大多数键)当按下某个键时,此标志将为零,而当它按下时up 标志将设置为 1,因此您可以通过以下方式将其反转:

 switch (mpRawInput->data.keyboard.VKey)
        {
        case VK_W: Input::mIsKeyDown[VK_W] = !mpRawInput->data.keyboard.Flags;  break;
        case VK_A: Input::mIsKeyDown[VK_A] = !mpRawInput->data.keyboard.Flags; break;
        case VK_S: Input::mIsKeyDown[VK_S] = !mpRawInput->data.keyboard.Flags; break;
        case VK_D: Input::mIsKeyDown[VK_D] = !mpRawInput->data.keyboard.Flags; break;
        case VK_SPACE: Input::mIsKeyDown[VK_SPACE] = !mpRawInput->data.keyboard.Flags;
        }      

使用 keyboard.flag 0 或 1 值意味着当您按下某个键时,您会收到标志消息 0,因此您将与此相反的消息发送到 "isKeyDown" bool。抬起该键时,标志将设置为 1。

对于其他键,您需要解决方法,例如,当数字锁定打开时箭头键的标志值为 3,而当它关闭时则为正常。其他键的行为完全不同,如 "Print Screen" 和 "Pause/Break"。真是一团糟。