Frage

Die einzige für .NET unterstützt Tastatur-Hook verwalteten Code ist ein Low-Level-Tastatur-Hook (WH_KEYBOARD_LL).

Siehe globalen Tastatur-Hook verwenden (WH_KEYBOARD_LL) in WPF / C #

Ich habe den obigen Code zur Zeit in meiner Anwendung arbeiten, so dass, wenn Sie Ihre Karte Swipe finden Sie eine Liste aller Tastenanschläge bekommen. Das Problem ist für die Eingabe Trennzeichen wie „%“ und „;“ es wird mir Alt + Numpad + schicken? WPF Key-Objekte zu diesen Symbolen entsprechen.

Meine Frage: Gibt es eine Möglichkeit diese verhalten sich mehr auf hohem Niveau zu machen, das heißt, eine Zeichenfolge von allen Tastaturbefehle erzeugt zu erfassen

Cheers!

War es hilfreich?

Lösung

Nicht sicher, was los ist, aber ein Zeichen wie% aus einer Tastatur Haken bekommen ist sehr untrivial. Der Haken nur informiert Sie über virtuelle Tasten. Aber% ist ein Tipp Schlüssel, die durch Shift + 5 auf meiner Tastatur (ein US-Layout) drücken. Windows erzeugt normalerweise diese Zeichen durch die Verarbeitung der WM_KEYDOWN / UP-Nachrichten, eine WM_CHAR-Meldung für die Eingabe-Taste zu erzeugen. Das passiert nicht in Ihrem Fall. Die Low-Level-Windows-Funktion, die dies tut, ist ToUnicodeEx ().

Andere Tipps

Ich würde vermuten, wenn Sie die Karte sind klauen, dann ist es eine Eingabe irgendwo auf der wpf Form, wie eine Textbox zum Beispiel? Dann würde ich geneigt sein, ein Ereignis hinzuzufügen, vielleicht ein KeyUp Ereignishandler, Im KeyUp Event-Handler (Die Tastatur Keilkartenscanner ein End-of-processing Signal wie ENTER, um anzuzeigen, die Swipe erfolgreich war ja? Schickt), Aufbau eine Zeichenfolge mit Stringbuilder, und wenn das End-of-processing Signal wie ENTER gefangen wird, können Sie dann das „%“ entfernen und „;“ aus der Stringbuilder-Instanz und tun, was Sie mit ihm zu tun haben.

Es könnte einfacher sein, eine staatliche System zu verwenden, wenn die KeyUp-Ereignishandler ein „%“ empfangen, dann eine anderen Zustand eintreten, wo das Ende erwarteten Zustand eine wäre „;“

static bool StartState = false;
StringBuilder sbInput = new StringBuilder();
private void textBox1_KeyUp(object sender, KeyEventArgs e)
{
   if (!StartState){
    if (e.KeyCode == Keys.D5) StartState = true;
    sbInput.Append((char)e.KeyValue);
   }else{
    if (e.KeyCode == Keys.OemSemicolon){
       StartState = false;
       // sbInput will contain the data from the scanner,
       // copy it somewhere else and reset sbInput
       // sbInput.Remove(0, sbInput.Length); 
    }
    sbInput.Append((char)e.KeyValue);
   }
   e.Handled = true;
}

Hope, das hilft, Freundliche Grüße, Tom.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top