2012-10-11 15 views
5

データグリッドを持つWPFウィンドウがあります。私は、Symbolスキャナから仮想ウェッジを介して送信されている文字列をキャプチャしようとしています。アプリケーションには、文字が入力されたように見えます。この文字列は、ASCII 1(SOH)で始まります。DataGrid PreviewTextInputイベントコントロール文字を入力から削除します。

ウィンドウにフォーカスがあると、ウィンドウの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 
+0

私の答えについての任意の考え?助けてくれますか? – Alan

答えて

1

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

このようなことを試したことがありますか?

MSDNフォーラムのこの投稿は、関連すると思われる(Converting Key To ASCII

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

制御文字を生成しないキーボードウェッジモード用にリーダーを設定する必要があります。必要に応じて、SODを検出するための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)); 
    } 
関連する問題