【问题标题】:win32 raw keyboard input remove autorepeatwin32 原始键盘输入删除自动重复
【发布时间】:2018-02-21 16:21:43
【问题描述】:

所以手头的问题大致如下: Windows key repeat settings affecting Raw Input messages

虽然这可能是重复的,但没有提供答案,所以在这里:

  1. 我的印象是,例如对于 FPS 游戏开发,应该使用原始输入。然而,问题在于输入毕竟不是那么原始,并且包括延迟(对于连续按键),并且只有在初始延迟之后才会连续按键,即 WM_INPUT 消息的连续流。使用 DirectInput(已弃用)时,我没有这些问题。有没有办法只使用原始输入来实现同样的事情?明确地说,我想要的是,如果我连续按下一个键,我会不断收到 WM_INPUT 消息,而不会出现由自动重复引起的初始延迟。 我使用的是原始输入标准读取,而不是缓冲的 (https://msdn.microsoft.com/en-us/library/windows/desktop/ms645546(v=vs.85).aspx)

  2. 上述标准原始输入读数和缓冲的读数之间的区别在哪里?

【问题讨论】:

  • 我不具体了解 win32 原始输入 - 但通常情况下,如果您已经知道按键已按下,您只需忽略 keydown 事件。
  • 您通常不应该将 Win32 RAW 输入用于鼠标以外的任何东西。请参阅 DirectX Tool KitKeyboardMouse 类。

标签: c++ winapi directx


【解决方案1】:

DirectInput 是一个过时的异步抽象层,它做的事情完全相同:处理原始输入。除非您需要支持操纵杆或任何遗留系统,否则不建议使用它,因为游戏手柄建议使用 XInput。

Windows 不是实时操作系统,最好的选择是坚持使用 WM_INPUT 消息。这需要维护一个关键状态数组 (bool keyState[256]) 并将您的逻辑基于 if(keyState[VK_BACKSPACE] == true){}。 如果您还想捕获按下开始和释放事件,则必须维护最后一个键状态的数组,并分析 WM_INPUT 检查更改,并且仅当键的最后一个状态为假和 WM_INPUT 消息时才产生按下开始事件表示现在按下了键。

另一种选择是使用 GetAsyncKeyState 定期手动检查所有输入。但是,如果它发生在您两次调用 GetAsyncKeyState 之间,那么您将无法捕捉到按键。该函数的文档说低位准确地说明了这一点,但是该位在所有应用程序之间共享,并且可以被其他应用程序重置,这很可悲。

如果我理解正确,您想要的只是暂时的关键状态,可以通过Keyboard 等帮助类轻松获得,但它不使用 WM_INPUT,因此由于窗口检查层可能会出现轻微延迟.

auto kb = keyboard->GetState();

if (kb.Back)
    // Backspace key is down, with no delay of waiting for key repeat

【讨论】:

  • 不知道工具包中的鼠标和键盘类。有了这些,它就可以完美地工作了!
猜你喜欢
  • 2022-11-25
  • 1970-01-01
  • 2014-05-28
  • 2011-06-11
  • 1970-01-01
  • 2012-12-13
  • 1970-01-01
  • 2015-01-28
相关资源
最近更新 更多