Konzentrieren Sie das KeyDown-Ereignis (Keys) auf eine C # -String (wpf)

Ich habe einen Magnetkartenleser, der die Tastatureingabe zum Senden von Daten verwendet. Ich verwende ein KeyDown-Ereignis, bei dem ich dieses Objekt erhalte (C # WPF):

<code>KeyEventArgs e
</code>

Ich möchte die Schlüssel, die ich bekomme, nehmen und sie zu einer Schnur zusammenfügen. Ich versuchte mich zu unterhaltene.Key.ToString(), aber das geht nicht. Meine Eingabe enthält viele Zahlen und Zeichen (wie z. B.? = Usw.), und die Funktion e.Key.ToString () funktioniert nicht (es gibt mir D3 für eine Zahl und UMSCHALT oder STRG + eine andere Taste für die Zeichen).

Ich möchte nur die Zeichenfolge, also wenn ich zum Beispiel Console.WriteLine verwende, erhalte ich so etwas wie

<code>;51895401051=000001341?
</code>

und nicht

<code>Oem1SHIFTD1CNTRLD2D3D2D1SHIFTD9OemQuestion ....
</code>

Ich habe versucht, KeyConverter zu verwenden, konnte dies jedoch nicht herausfinden.

Kann mir bitte jemand helfen?

Mein aktueller Ereignishandler (der nicht richtig funktioniert) ist:

<code> public static void keyPress(Object sender, KeyEventArgs e)
    {

            string keyCodeString = e.Key.ToString();

            char? key = null;

            if (keyCodeString.Length == 1)
            {
                key = keyCodeString[0];
            }
            else
            {
                if (keyCodeString.StartsWith("NumPad"))
                {
                    key = keyCodeString[keyCodeString.Length - 1];
                }
                else if (keyCodeString.StartsWith("D"))
                    key = keyCodeString[keyCodeString.Length - 1];
            }
            TypedText += key;
        }
</code>

Wobei TypedText die Zeichenfolge ist, auf die ich die Schlüssel beschränken möchte. Die Ausgabeergebnisse wurden oben erläutert.

Ich habe es selbst gelöst. Hier ist die Antwort. DasGetCharFromKey Die folgende Funktion erhält einen Schlüssel (Sie sollten e.Key senden) und gibt ein Zeichen zurück:

<code> public enum MapType : uint
    {
        MAPVK_VK_TO_VSC = 0x0,
        MAPVK_VSC_TO_VK = 0x1,
        MAPVK_VK_TO_CHAR = 0x2,
        MAPVK_VSC_TO_VK_EX = 0x3,
    }
    [DllImport("user32.dll")]
    public static extern bool GetKeyboardState(byte[] lpKeyState);
    [DllImport("user32.dll")]
    public static extern uint MapVirtualKey(uint uCode, MapType uMapType);
    [DllImport("user32.dll")]
    public static extern int ToUnicode(
     uint wVirtKey,
     uint wScanCode,
     byte[] lpKeyState,
     [Out, MarshalAs(UnmanagedType.LPWStr, SizeParamIndex = 4)] 
        StringBuilder pwszBuff,
     int cchBuff,
     uint wFlags);

    public static char GetCharFromKey(Key key)
    {
        char ch = ' ';

        int virtualKey = KeyInterop.VirtualKeyFromKey(key);
        byte[] keyboardState = new byte[256];
        GetKeyboardState(keyboardState);

        uint scanCode = MapVirtualKey((uint)virtualKey, MapType.MAPVK_VK_TO_VSC);
        StringBuilder stringBuilder = new StringBuilder(2);

        int result = ToUnicode((uint)virtualKey, scanCode, keyboardState, stringBuilder, stringBuilder.Capacity, 0);
        switch (result)
        {
            case -1:
                break;
            case 0:
                break;
            case 1:
                {
                    ch = stringBuilder[0];
                    break;
                }
            default:
                {
                    ch = stringBuilder[0];
                    break;
                }
        }
        return ch;
    }
</code>

Antworten auf die Frage(3)

Ihre Antwort auf die Frage