GetKeyboardState(aByteArray)
をWPFアプリケーション(およびほかのアプリケーションも同様)から呼び出すと、SHIFT
キーを押し続けると、アプリケーションにフォーカスがあるときだけ正しく検出されます。アプリケーションにフォーカスがないときは、メソッドコールの後に0
になる。aByteArray[VK_SHIFT]
WINAPIアプリケーションのフォーカスが外れているときGetKeyStateによってGetKeyboardStateの動作が変更されましたか?
しかし、GetKeyState(aVKCode)
場合、アプリケーションがフォーカスされていない場合、戻り値は破棄されても、その後GetKeyboardState(aByteArray)
を保持SHIFT
キーの正しい非ゼロ状態を提供する、aVKCode
の任意の値の直前GetKeyboardState(aByteArray),
と呼ばれ。
この動作は直感的ではなく、多くのプログラマの悲嘆を引き起こしているようです。
メッセージに関連する情報があると考えられます。スレッドがメッセージキューからキーボードメッセージを削除すると、ステータスが変わります。キーボードメッセージがスレッドのメッセージキューにポストされたり、キーボードメッセージが他のスレッドのメッセージキューにポストされたり、他のスレッドのメッセージキューから取得されたりすると、ステータスは変化しません。
潜在的に、GetKeyState()
は、所望のように動作するGetKeyboardState()
ために前GetKeyboardState()
に呼び出されなければならないような方法で、メッセージキューと相互作用します。しかし、私はメッセージキューの概念や、Windowsで項目を追加したり削除したりする方法についてよく知らないので、私はここで質問したいと思っていました。誰もがなぜGetKeyboardState()
への呼び出しがアプリケーションフォーカスなしで保持されているSHIFT
キーをキャプチャできないのか説明できますか?
(キーボード入力)は、スレッド(または入力接続スレッドのグループ)ごとに仮想化されています。各スレッドは、それ自身のキーボード状態情報を維持する。スレッドが所有するウィンドウに入力フォーカスがある間にキーを押すと、他のスレッド(このスレッドに接続されているスレッドを除く)のキーボード状態は更新されません。詳細については、[非同期入力と同期入力、簡単な紹介](https://blogs.msdn.microsoft.com/oldnewthing/20130604-00/?p=4173)を参照してください。 – IInspectable