win32原始键盘输入删除自动重复
win32 raw keyboard input remove autorepeat
所以手头的问题大致如下:
虽然这可能是重复的,但没有提供答案,所以这里是:
我的印象是,例如对于 FPS 游戏开发,应该使用原始输入。然而,问题在于输入毕竟不是那么原始,并且包括延迟(对于连续按键)并且仅在初始延迟之后连续按键,即 WM_INPUT 消息的连续流。使用 DirectInput(已弃用)时,我没有这些问题。有没有办法只使用原始输入来实现同样的事情?明确地说,我想要的是,如果我连续按下一个键,我会连续收到 WM_INPUT 消息,而不会出现由自动重复引起的初始延迟。
我正在使用原始输入标准读取,而不是缓冲的 (https://msdn.microsoft.com/en-us/library/windows/desktop/ms645546(v=vs.85).aspx)
前面提到的标准原始输入读取和缓冲读取之间的区别在哪里?
DirectInput 是一个过时的异步抽象层,它做同样的事情:处理原始输入。不建议使用它,除非你需要支持操纵杆或任何遗留的东西,对于游戏手柄,建议使用 XInput。
Windows 不是实时 OS,最好的选择是坚持 WM_INPUT 消息。这需要维护一个键状态数组 (bool keyState[256]) 并将您的逻辑作为 if(keyState[VK_BACKSPACE] == true){} 的基础。
如果你还想捕捉按下开始和释放事件,你将不得不维护最后一个键状态的数组,并分析 WM_INPUT 检查变化,并且只有当键的最后一个状态是false 和 WM_INPUT 消息说现在按下了键。
另一种选择是使用 GetAsyncKeyState 定期手动检查所有输入。但是,如果按键操作发生在两次调用 GetAsyncKeyState 之间,那么您将无法捕捉到按键操作。该函数的文档说低位准确说明了这一点,但是该位在所有应用程序之间共享,并且可以被其他应用程序重置,这很遗憾。
如果我没理解错的话,你想要的只是瞬时按键状态,可以像Keyboard一样通过helper 类轻松获取,但它不使用WM_INPUT ,因此 window 检查层可能会导致轻微的延迟。
auto kb = keyboard->GetState();
if (kb.Back)
// Backspace key is down, with no delay of waiting for key repeat
所以手头的问题大致如下:
虽然这可能是重复的,但没有提供答案,所以这里是:
我的印象是,例如对于 FPS 游戏开发,应该使用原始输入。然而,问题在于输入毕竟不是那么原始,并且包括延迟(对于连续按键)并且仅在初始延迟之后连续按键,即 WM_INPUT 消息的连续流。使用 DirectInput(已弃用)时,我没有这些问题。有没有办法只使用原始输入来实现同样的事情?明确地说,我想要的是,如果我连续按下一个键,我会连续收到 WM_INPUT 消息,而不会出现由自动重复引起的初始延迟。 我正在使用原始输入标准读取,而不是缓冲的 (https://msdn.microsoft.com/en-us/library/windows/desktop/ms645546(v=vs.85).aspx)
前面提到的标准原始输入读取和缓冲读取之间的区别在哪里?
DirectInput 是一个过时的异步抽象层,它做同样的事情:处理原始输入。不建议使用它,除非你需要支持操纵杆或任何遗留的东西,对于游戏手柄,建议使用 XInput。
Windows 不是实时 OS,最好的选择是坚持 WM_INPUT 消息。这需要维护一个键状态数组 (bool keyState[256]) 并将您的逻辑作为 if(keyState[VK_BACKSPACE] == true){} 的基础。 如果你还想捕捉按下开始和释放事件,你将不得不维护最后一个键状态的数组,并分析 WM_INPUT 检查变化,并且只有当键的最后一个状态是false 和 WM_INPUT 消息说现在按下了键。
另一种选择是使用 GetAsyncKeyState 定期手动检查所有输入。但是,如果按键操作发生在两次调用 GetAsyncKeyState 之间,那么您将无法捕捉到按键操作。该函数的文档说低位准确说明了这一点,但是该位在所有应用程序之间共享,并且可以被其他应用程序重置,这很遗憾。
如果我没理解错的话,你想要的只是瞬时按键状态,可以像Keyboard一样通过helper 类轻松获取,但它不使用WM_INPUT ,因此 window 检查层可能会导致轻微的延迟。
auto kb = keyboard->GetState();
if (kb.Back)
// Backspace key is down, with no delay of waiting for key repeat