WIN32 RAW键盘输入删除自动点

win32 raw keyboard input remove autorepeat

本文关键字:删除 输入 RAW 键盘 WIN32      更新时间:2023-10-16

,因此手头的问题几乎是:Windows密钥重复设置影响原始输入消息

尽管这可能是重复的,但没有提供答案,因此它进行了:

  1. 我的印象是对于FPS游戏开发,应该使用原始输入。但是,问题是,毕竟输入不是很原始的,并且包括一个延迟(对于连续的键盘),并且只有在初始延迟之后,连续键按,即WM_INPUT消息的连续流。使用DirectInput(已弃用)时,我没有这些问题。有没有一种方法可以仅使用原始输入来实现同一件事?需要明确的是,我想要的是,如果我不断按键,我会不断收到WM_INPUT消息,而不会引起自动驾驶引起的初始延迟。我使用的是原始输入标准读取,而不是缓冲读(https://msdn.microsoft.com/en-us/library/windows/desktop/mss645546(v = vs.85).aspx .aspx)

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

directInput是一个过时的异步抽象层,它做得完全相同:过程原始输入。除非您需要支持操纵杆或任何遗产,否则不建议使用它,因为建议使用GamePads Xinput。

Windows不是实时操作系统,最好的选择是坚持使用WM_INPUT消息。这需要维护关键状态数组(Bool KeyState [256]),并基于您的逻辑,就好像(keyState [vk_backspace] == true){}。如果您还要捕获新闻发布会和发布事件,则必须维护最后一个密钥状态的数组,并分析WM_Input检查更改,并仅在键的最后一个状态为false和wm_input消息时才产生新闻开始事件说键现在按下。

另一个选项是使用getAsynCkeyState定期手动检查所有输入。但这将使您无法在两个呼叫getAsynckeystate之间发生钥匙按下。该函数的文档表明较低的位确切说明了这一点,但是该位在所有应用程序之间共享,并且可以通过其他应用程序重置,这是可悲的。

如果我正确理解您,您想要的只是瞬时的键状态,可以通过键盘等辅助类轻松获得,但是它不会使用WM_INPUT,因此由于窗口检查层而可能会出现较小的延迟。

auto kb = keyboard->GetState();
if (kb.Back)
    // Backspace key is down, with no delay of waiting for key repeat