0

この分野で(単一の入力デバイスを使用して)いくつかの調査を行ったところ、ほとんどの場合、メッセージは最初にWM_INPUT、次にWM_KEYDOWNのペアで送信されることがわかりました。したがって、フィルタリングのためにそれらをリンクすること、つまり、対応する WM_KEYDOWN が受信者に送信されないという WM_INPUT フラグが単に可能です (私の場合、最初にすべての WM_KEYDOWN を破棄してから、それらを受信者に送り返す必要があるときはいつでも決定します)。次のすべての WM_KEYDOWN が最後の WM_INPUT に属していると仮定します。

私の質問はまさにその原則に真剣に頼ることができますか? 複数の入力デバイスを使用すると、これらのメッセージが混同されませんか?

その信頼性については、すでに深刻な問題がいくつかあります。2. 複数のデバイスからの入力の場合、WM_INPUT-WM_KEYDOWN のペアが混同されますか? つまり、WM_INPUT、WM_INPUT、WM_KEYDOWN、WM_KEYDOWN のような行列を形成しますか?

また、すべての WM_KEYDOWN を破棄して、すべてのキーボード イベントを自分で生成することは可能でしょうか? 1 つの WM_INPUT から複数の WM_KEYDOWN が発生する可能性があるため (複数の WM_KEYDOWN、1 つの WM_KEYUP)、技術的には非常に困難です。

念のため、私が達成する必要があるのは次のとおりです。すべてのメッセージをそれらの間の時間でフィルタリングする必要があります。すべてのユーザー入力は、キーを押す間の時間間隔によってフィルター処理されます。2 つのメッセージが 50 ミリ秒未満の間隔で送信された場合、最初のメッセージを破棄し、2 番目のメッセージが TTL を超えている間待機し、そうであれば受信者に送信します。難点は、複数の入力デバイスが存在する可能性があり、それらのタイミングが互いに混乱することです。

4

2 に答える 2

0

複数のデバイスがあり、物事が台無しになっているという問題を理解しています。

すべてのデバイスには同じではない製品IDとベンダーIDがあるため、製品IDとベンダーIDに基づいてデバイスを区別することをお勧めします。

私は最近HIDデバイスに取り組んでいるので、これも役立つかもしれません。

于 2012-11-06T11:09:16.673 に答える
0

キーボード フック (WH_KEYBOARD) が WM_KEYDOWN メッセージの前に実際に発生することがわかりました。複数のデバイスからの同時入力が WM_INPUTS および KeyboardHook イベントの順序を台無しにするかどうかを確認できません (一連のイベントのように: Dev0_WM_INPUT Dev1_WM_INPUT Dev0_KBDHook Dev1_KBDHook - その一連のイベントの全体)私が恐れているのは、Dev1_KBDhook が Dev0_KBDhook の前に表示されるか、さらに悪いことです)。

WM_KEYDOWN ではこのような混乱が発生する可能性がありましたが、キーボード フックと同じになるかどうかはまだわかりません。

とにかくそれは可能な解決策です。WM_INPUT でメッセージ自体を作成して部分的に埋め、次の KeyboardHookEvent で残りの部分を埋めます。

通常、WM_INPUTs と KeyboardHook イベントはペアで発生しますが、前に述べたように、混乱する可能性があるかどうかは正確にはわかりませんが、そうであれば、KeyboardHookEvents と WM_INPUTS (Dev0_INPUT、Dev1_INPUT、Dev0_KBDEvent など) の順序が維持されるかどうかはわかりません。 Dev1_KBDEvent) これらのシーケンスを解析するのに問題はありません。たとえば、1 つのスタック: WM_INPUT は新しいメッセージ構造体をプッシュし、KBDEvent はポップして残りの部分を埋めます。

一般的には良い解決策ではありませんが、他に存在しない場合は使用するのに十分であり、少なくとも部分的に問題を解決すると思います。

複数のデバイスからの同時入力に対する動作をテストできたら、ここに情報を投稿します。全体として、処理できない混乱があるとは思えません。Windowsが対応するキーボードイベントをランダムに送信する時間を選択しない限り...

言い忘れましたが、はい、すべての入力を破棄して手動で生成することは部分的に可能です。PostMessage でメッセージを手動で偽造しただけです (KeyboardHookEvent から lparam を取得します)。しかし、それはいくつかの問題を引き起こします。ホットキーと同様に、GetAsyncKeyState を使用するものも機能しません。私の場合、それは完全に受け入れられます。

于 2012-11-06T12:33:12.517 に答える