當從WPF應用程序(以及其他應用程序)調用WINAPI命令GetKeyboardState(aByteArray)
時,只有在應用程序具有焦點時,才能正確檢測到按住SHIFT
鍵。當應用程序沒有焦點時,方法調用後aByteArray[VK_SHIFT]
爲0
。當應用程序不在焦點時,由GetKeyState修改的WINAPI GetKeyboardState行爲?
但是,如果GetKeyState(aVKCode)
是爲aVKCode
任何價值GetKeyboardState(aByteArray),
之前立即調用,即使返回值被丟棄,然後GetKeyboardState(aByteArray)
將提供舉行SHIFT
鍵的正確非零狀態,當應用程序不在焦點。
這種行爲是違反直覺的,似乎導致了很多程序員的悲痛。我認爲GetKeyboardState
的文檔中有相關信息,其內容如下:
狀態隨線程從其消息隊列中刪除鍵盤消息而發生更改。當鍵盤消息被髮布到線程的消息隊列時,狀態不會改變,也不會隨着鍵盤消息被髮布到其他線程的消息隊列或從其他線程的消息隊列中檢索到而改變。
潛在地,GetKeyState()
以這樣一種方式,它之前必須GetKeyboardState()
爲了GetKeyboardState()
稱爲表現爲期望的消息隊列相互作用。但是,我並不熟悉消息隊列的概念以及Windows如何添加和刪除項目,所以我想我會在這裏問。任何人都可以解釋爲什麼一個電話GetKeyboardState()
獨自無法捕捉沒有應用程序重點舉行的SHIFT
密鑰?
(鍵盤)輸入每個線程(或一組輸入連接的線程)被虛擬化。每個線程維護自己的鍵盤狀態信息。當線程擁有輸入焦點的窗口時按下鍵不會更新任何其他線程中的鍵盤狀態(連接到此線程的鍵除外)。有關[異步輸入vs同步輸入,快速介紹]的更多詳細信息,請參閱https://blogs.msdn.microsoft.com/oldnewthing/20130604-00/?p=4173。 – IInspectable