キーボードウェッジカードスキャナを読み取るためのC#とWPFのための高レベルのグローバルキーボードフック
-
22-09-2019 - |
質問
.NETのためにサポートされる唯一のキーボードフックは、コードは、低レベルのキーボードフック(WH_KEYBOARD_LL)で管理しました。
はWPF / C#でグローバルキーボードフック(WH_KEYBOARD_LL)を使用してを見ます
あなたのカードをスワイプしたときにすべてのキーストロークのリストを取得するように私は、現時点では私のアプリケーションで上記のコードの作業を持っています。問題は、このような「%」などの区切り文字を入力するためのもので、「;」それは私のAlt +テンキー+をお送りしますか! WPFのキーは、これらのシンボルに対応するオブジェクトます。
私の質問は:?でこの振る舞い、より高レベルは、すべてのキーボードコマンドから生成された文字列をキャプチャできるようにするいくつかの方法があります。
乾杯!
解決
わからない何が起こっているのが、キーボードフックのうち、%などの文字を取得することは非常にuntrivialです。フックは、仮想キーを通知します。しかし、%は私のキーボード(米国レイアウト)のShift + 5を押して、生産タイピングキー、です。 Windowsが正常にタイピングキーのWM_CHARメッセージを生成し、WM_KEYDOWN / UPメッセージを処理することにより、これらの文字を生成します。それはあなたのケースで起こっていません。これを行う低レベルのWindowsの機能がToUnicodeEx()です。
他のヒント
私は、あなたがカードをスワイプしている場合、WPFフォームに入力のどこかには、例えばテキストボックスのように、ありますよね?それから私は、keyUpイベントのイベントハンドラで、おそらくからkeyupイベントハンドラ、(キーボードウェッジカードスキャナは、このようなスワイプが成功しそうだった示すために入力すると、処理終了信号を送るのでしょうか?)、イベントを追加するために傾けられます、 StringBuilderのを使用して文字列ビルドアップ、及び、そのような入力すると、処理終了信号が捕捉されたとき、あなたは「%」を削除し、することができます「;」 StringBuilderのインスタンスから、あなたがそれをしなければならないものは何でも。
これは、KeyUpイベントハンドラは「%」を受信したとき、次に終了状態が可能と期待される別の状態入る、状態のシステムを使用する方が簡単かもしれない「と、」
static bool StartState = false; StringBuilder sbInput = new StringBuilder(); private void textBox1_KeyUp(object sender, KeyEventArgs e) { if (!StartState){ if (e.KeyCode == Keys.D5) StartState = true; sbInput.Append((char)e.KeyValue); }else{ if (e.KeyCode == Keys.OemSemicolon){ StartState = false; // sbInput will contain the data from the scanner, // copy it somewhere else and reset sbInput // sbInput.Remove(0, sbInput.Length); } sbInput.Append((char)e.KeyValue); } e.Handled = true; }
希望このことができます、 宜しくお願いします、 トムます。