2016-05-02 45 views
0

Windows鍵重複設置這應該是原始輸入從設備直接,這是奇怪的是,它是受這些設置:影響原始輸入消息

enter image description here

它不會得到一個WM_INPUT消息,直到延遲之後。重複率也影響它。我也嘗試用NO_LEGACY標誌註冊原始輸入設備,沒有區別。這是與我有這個問題的DirectX11應用程序。

case WM_INPUT: {Input::handleInput(uMsg, wParam, lParam); break; } 
+0

*按鍵重複*是操作系統的一項功能,而不是鍵盤硬件。這並不奇怪,「假」輸入是合成的,並且「SendInput」將是這樣做的工具。使用'SendInput'發送的輸入數據包在與來自設備驅動程序的數據包相同的輸入隊列中。目前還不清楚,你有什麼問題。 – IInspectable

回答

0

有沒有辦法來解決它顯然,一個gamedev教程解釋說,你就必須用自己的錯綜複雜的解決方法來處理它在你的代碼。原始輸入我的微軟。

按下並按住一個按鍵會發生什麼WM_INPUT將發送一個按鍵消息,等待Windows「按鍵重複延遲」已過,然後繼續以Windows「按鍵重複速度」設置發送按鍵消息。

我發現不是使用Makecode或Vkey成員,而是使用keyboard.flags成員更容易,因爲(對於大多數鍵),當某個鍵處於關閉狀態時,此標誌將爲零,並且當它到達標誌將被設置爲1,這樣你就可以僅僅通過倒轉:

switch (mpRawInput->data.keyboard.VKey) 
     { 
     case VK_W: Input::mIsKeyDown[VK_W] = !mpRawInput->data.keyboard.Flags; break; 
     case VK_A: Input::mIsKeyDown[VK_A] = !mpRawInput->data.keyboard.Flags; break; 
     case VK_S: Input::mIsKeyDown[VK_S] = !mpRawInput->data.keyboard.Flags; break; 
     case VK_D: Input::mIsKeyDown[VK_D] = !mpRawInput->data.keyboard.Flags; break; 
     case VK_SPACE: Input::mIsKeyDown[VK_SPACE] = !mpRawInput->data.keyboard.Flags; 
     }  

使用keyboard.flag當你按你的0標誌消息的0或1鍵值意味着,讓你送的對面即「isKeyDown」布爾。當該鍵被解除時,該標誌將被設置爲1.

對於其他鍵鍵您需要解決方法,例如,當num鎖打開時箭頭鍵的標誌值爲3,關閉時爲正常。其他鍵的行爲完全不同,如「打印屏幕」和「暫停/休息」。真是一團糟。

相關問題