2

バーコードスキャナーの「ドライバー」を作っています。

この特定のスキャナーは基本的に、何かがスキャンされるたびにキーストロークを生成する USB キーボードです。

これらのキーストロークを、適切なキーボードが送信するキーストロークと区別する方法を見つけたいと思っています。残念ながら、唯一の違いは、スキャナーがキーストロークを非常に高速に生成、一連のキーアップとキーダウンをほんの一瞬で生成することです。

私が見る方法は、すべての入力をインターセプトし、何らかの形で保存し、少し待ってから、それらのキーストロークをフックチェーンのさらに下に送信するか、スキャナーが生成して処理するものであると想定するグローバルキーボードフックを設定する必要があることです。適切に。

ただし、フックの使用経験がないため、正しい方法がわかりません。遅延キーストロークイベントを渡すために、他のスレッドCallNextHookEx()以外のメソッドで呼び出すことはできますか? KeyboardProc()それとも、新しいWM_KEYPRESSメッセージを手動で生成する必要がありますか? たぶん、このことについてもっと良い方法がありますか?

ありがとう。

4

1 に答える 1

4

わかりました、誰かが同様の問題に遭遇した場合の私の解決策は次のとおりです。

まず、WH_KEYBOARD_LLの代わりにフックを使用しWH_KEYBOARDます。

次に、SendInput()API 関数を使用して、不要なキーストロークをアクティブ ウィンドウに渡します。

第 3 に、低レベルのキーボード フックのコールバック関数にはKBDLLHOOKSTRUCT、パラメーターの 1 つとしてへのポインターがあります。LLKHF_INJECTEDビットフィールドで bit を使用しflagsて、生成したキーストロークと実際のキーストロークを区別します。あなたが偏執的で、他の誰かが同じトリックを引っ張っているのではないかと恐れている場合はdwExtraInfo、構造体の両方のメンバーを使用し、SendInput()コールバックを使用して、自分と他の誰かによって注入されたキーストロークを区別します。

第 4 に、Windows 7 は、入力の処理に時間がかかりすぎる場合、低レベルのフックを静かにアンフックする傾向があることに注意してください。そのため、フックのコールバックを可能な限りシンプルに保ち、Windows メッセージ キューを可能な限り頻繁に送り出すようにしてください。フックを引っ掛けたスレッド。または - あなたが悪い悪い子なら - にレジストリ キーがありHKCU\Control Panel\Desktop\[DWORD]LowLevelHooksTimeout、適度に大きな値に設定してもうまくいくかもしれません。

于 2012-10-25T07:47:19.570 に答える