2012-10-11 9 views
5

Ich habe ein WPF-Fenster mit einem Datenraster. Ich versuche, mit einem Symbol-Scanner eine Zeichenfolge zu erfassen, die über einen virtuellen Keil gesendet wird. Für die Anwendung sieht es so aus, als wären die Zeichen getippt worden. Diese Zeichenfolge beginnt mit ASCII 1 (SOH).DataGrid PreviewTextInput -Ereignis Entfernen von Steuerzeichen aus der Eingabe

Wenn das Fenster den Fokus hat, empfängt PreviewTextInput des Fensters den SOH zusammen mit allen anderen vom Menschen lesbaren und nicht von Menschen lesbaren Werten. Wenn das Datagrid jedoch den Fokus hat, werden die nicht von Menschen lesbaren Zeichen entfernt.

Wenn ich ein PreviewKeyDown oder PreviewKeyUp auf dem Fenster habe, dann erscheinen die Zeichen richtig, egal was Fokus hat. Irgendwo entlang des Weges streift das Datengitter es aus. Leider, weil KeyDown/KeyUp die ASCII-Zeichen nicht anzeigt, kann ich diese Ereignisse nicht verwenden, ohne eine Art Parsing-Algorithmus schreiben zu müssen.

Kann mir jemand sagen, was ich tun kann, damit diese nicht-menschenlesbaren Steuerzeichen immer an PreviewTextInput gesendet werden? Oder wie analysiert man alle Zeichen in PreviewKeyDown?

Edited:

Wenn das Fenster den Fokus hat:

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

Wenn das Datenraster Fokus hat:

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

keine Gedanken über meine Antwort? Hilft es? – Alan

Antwort

1

Okay, ich weiß, das ist nicht ganz das, was man sein kann Ich erwarte, aber ich habe etwas Erfahrung beim Schreiben von Software für einige Symbol Barcodescanner. In einer Anwendung haben wir Nutzer ihre Badges scannen lassen, um sich zu authentifizieren, um bestimmte Bedingungen zu überschreiben. Wir wollten, dass der Benutzer seinen Ausweis "scannt" und nicht in der Lage ist, mit der Tastatur Zahlen einzugeben. Ich erinnere mich, dass wir eine lange Zeit damit verbracht haben, herauszufinden, wie man die Eingabe nicht wie von der Tastatur eingegeben reinkommen lässt. Ich glaube, wir konnten einige Konfigurationscodes aus dem Handbuch des Symbol-Barcodescanners scannen, um es so zu konfigurieren, dass es ein USB-Gerät ist, das wir öffnen und wie wir es handhaben wollten. Dieser Ansatz war viel besser für uns.

Haben Sie daran gedacht, so etwas zu versuchen?

Dieser Beitrag auf den MSDN-Foren scheint relevant (Converting Key To ASCII

Barcode-Leser in der Regel in zwei Modi betrieben werden. Eine davon ist, wo es als Tastatur Keil wirkt, den Code Tastenanschläge, als ob der Benutzer zu erzeugen eingegeben hat. Eine andere Möglichkeit besteht darin, dass ein Anwendungsprogramm den gescannten Code direkt über eine serielle Schnittstelle empfängt und den Leser in einen Modus versetzt, in dem er Codes erzeugt, die für die letztgenannte Art geeignet sind: Strg + B ist ein Steuercode, SOH (Start Of (Header) .Es wird verwendet, um das Programm mit dem Lesegerät zu synchronisieren, SOH zeigt den Beginn eines Scans an, Sie würden es verwenden, um einen Pufferindex zurückzusetzen

Sie sollten das Lesegerät für den Tastaturkeilmodus konfigurieren, in dem die Steuerzeichen nicht generiert werden. Sie können es bei Bedarf weiterhin ausführen, indem Sie sowohl einen KeyDown-Ereignishandler zum Erkennen des SOH als auch einen KeyPressed-Ereignishandler zum Erkennen der Scancodes schreiben. Vermeiden Sie es, Schlüsselstriche, die Sie in KeyDown sehen, in Zeichen zu konvertieren. KeyPressed tut dies bereits für Sie.

Ich glaube, dies funktionieren kann für Sie ASCII zu konvertieren:

[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)); 
    } 
Verwandte Themen