2017-09-13 58 views
2

所以手邊的問題是相當多的以下內容: Windows key repeat settings affecting Raw Input messageswin32的原始鍵盤輸入刪除自動重複

雖然這可能是一個重複的話,也沒有提供答案,所以這裏有雲:

  1. 我的印象是,例如對於FPS遊戲開發,應該使用原始輸入。然而,問題在於輸入不是最原始的,並且包含一個延遲(對於連續keydown),並且只有在初始延遲之後連續按下按鍵,即WM_INPUT消息的連續流。當使用DirectInput(已棄用)時,我沒有這些問題。有沒有一種方法可以僅使用原始輸入來實現相同的功能?要清楚,我想要的是,如果我連續按下一個鍵,我會不斷獲取WM_INPUT消息,而不會由自動重複引起的初始延遲。 我正在使用原始輸入標準讀取,而不是緩衝的(https://msdn.microsoft.com/en-us/library/windows/desktop/ms645546(v=vs.85).aspx

  2. 上述標準原始輸入讀數和緩衝輸入讀數之間的區別在哪裏?

+1

我不知道關於win32原始輸入的具體內容 - 但通常情況下,如果您已經知道關鍵字已關閉,您只需忽略該關鍵事件。 – immibis

+1

除了鼠標之外,您通常不應該使用Win32 RAW輸入。請參閱[DirectX Tool Kit](https://github.com/Microsoft/DirectXTK)以及''Keyboard''和''Mouse''類。 –

回答

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 
+0

不知道該工具包中的鼠標和鍵盤類。這些工作完美無瑕! – VGD