1

磁気カードリーダーを使用しています。

USBポートに接続してメモ帳を開くと、次の正しい結果が得られます。

%B4290071074381429^NAZARKO/C M               ^1302101000002024976000000000002?;4290071074381429=13021010000020204976?

Windows API関数を呼び出すキーボードフック(C#で記述)を使用すると、次のような一貫性のない結果が得られます。

%B42()071074381429^NAZARKO/C M               ^1302101000002024976000000000002?;4290071074381429=13021010000020204976?

ご覧のとおり、ここでの問題は、「9」キーと「0」キーが押されたときにSHIFTが押されたかのように、最初の「90」が「()」になることです。

キーボードフックコードはここ(Keyboard.cs)からのものです: https ://nappybar.googlecode.com/svn/Keyboard.cs そしてそれは次のように設定されます:

            _kbHook = new KeyboardHook();
            _kbHook.KeyIntercepted += KeyboardHook_KeyIntercepted;
            _kbHook.SetParameters(KeyboardHook.Parameters.AllowAltTab);
            _kbHook.SetParameters(KeyboardHook.Parameters.PassAllKeysToNextApp);

上記のように、これをカードリーダーで使用したときに得られる結果には一貫性がありません。(GetKeyboardState)のキーボードの状態が完全に正しくないようです。主に、Shiftキーを押してはいけないときに押す、またはその逆の場合があります。 http://msdn.microsoft.com/en-us/library/windows/desktop/ms646299(v=vs.85).aspx

なぜこれが起こっているのか、そしてなぜそれがメモ帳で正しく機能しているのか誰かが知っていますか?そしてもっと重要なことに、どうすればそれを修正/回避できますか?ありがとうございました。

4

1 に答える 1

4

スレッド内で実行される低レベルのキーボード フックを使用しています。したがって、呼び出すGetKeyboardStateと、メモ帳のキーボードの状態ではなく、自分のローカル キーボードの状態が取得されます。このルートに沿って続行する場合は、シフト キーの状態を手動で追跡する必要があります。アプリケーションで通常のキーボード メッセージを処理しないのはなぜですか? なぜグローバルフックが必要なのですか? それらを正常に処理すると、Shift キーの処理が行われ、呼び出すとGetKeyboardState適切なキーの状態が表示されます。生のキーボード アクティビティをタイプされた文字に変換することは、非常に難しいことで知られています。Shift キーの状態に加えて、Caps Lock と IME について心配する必要があります。

于 2012-08-06T13:56:42.767 に答える