5

データグリッドを備えた WPF ウィンドウがあります。仮想ウェッジを介して送信されている文字列をシンボル スキャナーから取得しようとしています。アプリケーションには、文字が入力されたように見えます。この文字列は ASCII 1 (SOH) で始まります。

ウィンドウにフォーカスがある場合、ウィンドウの PreviewTextInput は、他のすべての人間が読み取れる値および人間が読み取れない値と共に SOH を受け取ります。 ただし、データグリッドにフォーカスがある場合、人間が読み取れない文字は取り除かれます。

ウィンドウに PreviewKeyDown または PreviewKeyUp がある場合、何がフォーカスされていても、文字は正しく表示されます。そのため、途中でデータ グリッドがそれを取り除きます。残念ながら、KeyDown/KeyUp は ASCII 文字を表示しないため、何らかの解析アルゴリズムを書かないとこれらのイベントを使用できません。

人間が読めない制御文字を常に PreviewTextInput に送信するために何ができるか教えてもらえますか? または、PreviewKeyDown のすべての文字を解析する方法は?

編集:

ウィンドウにフォーカスがある場合:

Window PreviewKeyDown - LeftCtrl
Window PreviewKeyDown - A
Window PreviewTextInput - <SOH>
Window PreviewKeyDown - Oem6
Window PreviewTextInput - ]
Window PreviewKeyDown - LeftShift
Window PreviewKeyDown - C
Window PreviewTextInput - C

データ グリッドにフォーカスがある場合:

Window PreviewKeyDown - LeftCtrl
DataGrid PreviewKeyDown - LeftCtrl
Window PreviewKeyDown - A
DataGrid PreviewKeyDown - A
Window PreviewKeyDown - Oem6
DataGrid PreviewKeyDown - Oem6
Window PreviewTextInput - ]
Window PreviewKeyDown - LeftShift
DataGrid PreviewKeyDown - LeftShift
Window PreviewKeyDown - C
DataGrid PreviewKeyDown - C
Window PreviewTextInput - C
4

1 に答える 1

1

わかりました、これはあなたが期待しているものではないかもしれませんが、私はいくつかの Symbol バーコード スキャナー用のソフトウェアを書いた経験があります。あるアプリケーションでは、ユーザーにバッジをスキャンして自分自身を認証させ、特定の条件を無効にしました。ユーザーが自分のバッジを「スキャン」して、キーボードで数字を入力できないようにしたかったのです。キーボードから入力されたように入力されないようにする方法を見つけるのに長い時間を費やしたことを覚えています。Symbol バーコード スキャナのマニュアルからいくつかの構成コードをスキャンして、必要に応じて開いて入力を処理できる USB デバイスとして構成できたと思います。このアプローチは、私たちにとってはるかに優れていました。

そのようなことをしようと考えたことはありますか?

MSDN フォーラムのこの投稿は関連しているようです ( Converting Key To ASCII

通常、バーコード リーダーは 2 つのモードで動作します。1 つはキーボード ウェッジとして機能し、ユーザーがコードを入力したかのようにキーストロークを生成します。もう 1 つは、アプリケーション プログラムが、通常はシリアル ポートを介して、スキャンされたコードを直接受信する場合です。後者の方法に適したコードを生成するモードにリーダーを切り替えました。Ctrl+B は制御コード、SOH (Start Of Header) です。プログラムをリーダーと同期させるために使用されます。SOH はスキャンの開始を示します。バッファ インデックスをリセットするために使用します。

制御文字を生成しないキーボード ウェッジ モード用にリーダーを構成する必要があります。必要に応じて、SOH を検出する KeyDown イベント ハンドラーと、スキャン コードを検出する KeyPressed イベント ハンドラーの両方を作成することで、引き続き動作させることができます。KeyDown に表示されるキー ストロークを文字に変換しようとするのは避けてください。KeyPressed は既にこれを行っています。

これはASCIIに変換するのに役立つと思います:

[DllImport("user32.dll")]
    static extern int ToAsciiEx(uint uVirtKey, uint uScanCode, byte[] lpKeyState, byte[] arr, uint uFlags, IntPtr hkl);

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool GetKeyboardState(byte[] lpKeyState);


    private void Window_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        byte[] keyboardState = new byte[256];
        int keyCode = KeyInterop.VirtualKeyFromKey(e.Key);
        byte[] arr = new byte[4];
        GetKeyboardState(keyboardState );
        Debug.WriteLineIf(ToAsciiEx((uint)keyCode, 0, keyboardState, arr, 0, IntPtr.Zero) > 0, ASCIIEncoding.ASCII.GetString(arr));
    }
于 2012-10-16T03:21:05.127 に答える