0

.NETマネージコードでサポートされている唯一のキーボードフックは、低レベルのキーボードフック(WH_KEYBOARD_LL)です。

WPF / C#でのグローバルキーボードフック(WH_KEYBOARD_LL)の使用を参照してください。

現在、上記のコードがアプリケーションで機能しているので、カードをスワイプすると、すべてのキーストロークのリストが表示されます。問題は、「%」や「;」などの区切り文字を入力することです。Alt + Numpad +が送られてきますか?これらのシンボルに対応するWPFキーオブジェクト。

私の質問:これをより高レベルで動作させる方法、つまり、すべてのキーボードコマンドから生成された文字列をキャプチャする方法はありますか?

乾杯!

4

2 に答える 2

0

何が起こっているのかわかりませんが、キーボード フックから % のような文字を取得するのは非常に簡単ではありません。フックは仮想キーのみを通知します。しかし、 % はタイピング キーであり、私のキーボード (US レイアウト) で Shift + 5 を押すことによって生成されます。Windows は通常、WM_KEYDOWN/UP メッセージを処理してこれらの文字を生成し、入力キーの WM_CHAR メッセージを生成します。あなたの場合はそうではありません。これを行う低レベルの Windows 関数は ToUnicodeEx() です。

于 2010-01-26T02:23:43.333 に答える
0

カードをスワイプしている場合、たとえばテキストボックスのように、wpf フォームのどこかに入力があると思いますか? 次に、イベント、おそらく KeyUp イベント ハンドラーを追加する傾向があります (キーボード ウェッジ カード スキャナーは、スワイプが成功したことを示すために ENTER などの処理終了信号を送信しますか?)、KeyUp イベント ハンドラーで、 StringBuilder を使用して文字列を作成し、ENTER などの処理終了シグナルがキャッチされると、「%」と「;」を削除できます。StringBuilder インスタンスから取得し、必要なことは何でも行います。

KeyUp イベント ハンドラーが "%" を受け取ったときに、状態システムを使用する方が簡単な場合があります。次に、期待される終了状態が ";" になる別の状態に入ります。

static bool StartState = false;
StringBuilder sbInput = new StringBuilder();
private void textBox1_KeyUp(オブジェクト送信者, KeyEventArgs e)
{
   if (!StartState){
    if (e.KeyCode == Keys.D5) StartState = true;
    sbInput.Append((char)e.KeyValue);
   }そうしないと{
    if (e.KeyCode == Keys.OemSemicolon){
       StartState = false;
       // sbInput にはスキャナからのデータが含まれます。
       // 別の場所にコピーして sbInput をリセット
       // sbInput.Remove(0, sbInput.Length);
    }
    sbInput.Append((char)e.KeyValue);
   }
   e.Handled = true;
}

これがお役に立てば幸いです。よろしくお願いします、トム。

于 2010-01-26T02:32:40.863 に答える