win32原始键盘输入删除自动重复

时间:2017-09-13 05:16:40

标签: c++ winapi directx

所以手头的问题几乎是以下几点: Windows key repeat settings affecting Raw Input messages

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

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

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

1 个答案:

答案 0 :(得分:1)

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

Windows不是实时操作系统,最好的选择是坚持使用WM_INPUT消息。这需要维护一组关键状态(bool keyState [256])并将您的逻辑基于(keyState [VK_BACKSPACE] == true){}。 如果您还要捕获按下启动和释放事件,则必须维护最后一个键状态的数组,并分析WM_INPUT检查更改,并仅在最后一个键的状态为false且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