2012-04-19 15 views
6

Posiadam czytnik kart magnetycznych, który wykorzystuje dane z klawiatury do wysyłania danych. Używam zdarzenie KeyDown gdzie mogę dostać ten obiekt (C# WPF):Zdarzenie Concap KeyDown (klucze) do jednego ciągu C# (wpf)

KeyEventArgs e 

Chcę wziąć klucze że dostanę i uczynić je jednym ciągiem. Próbowałem konkatować e.Key.ToString(), ale to nie działa. Moje dane wejściowe zawierają wiele liczb i znaków (np.? = Itd.), A funkcja e.Key.ToString() nie działa (daje mi D3 dla numeru, i SHIFT lub CTRL + inny klucz dla znaki).

Chcę po prostu ciąg, więc kiedy mogę używać na przykład Console.WriteLine dostanę coś

;51895401051=000001341? 

i nie

Oem1SHIFTD1CNTRLD2D3D2D1SHIFTD9OemQuestion .... 

Próbowałem za pomocą KeyConverter ale nie udało mi się rysunek to na zewnątrz.

Czy ktoś może mi pomóc?

Mój obecny obsługi zdarzeń (który nie działa poprawnie) to:

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; 
     } 

Gdzie TypedText jest ciąg Chcę Concat klucze do. Wyniki wyjściowe wyjaśniono powyżej.


I rozwiązać go samodzielnie. Oto odpowiedź. GetCharFromKey funkcja poniżej dostaje klucz (należy wysłać e.Key) i zwraca char:

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; 
    } 
+0

zakładam w tej chwili używasz czytnika kart jak emulator klawiatury. Czy ma jakiś SDK, którego możesz użyć? Zwykle takie urządzenia są dostarczane ze sterownikami i kontrolkami/interfejsami API, z których można korzystać w swoich aplikacjach. – StaWho

+0

to tylko wejście z klawiatury. fakt, że jest to czytnik kart lub tylko mumble bigos, który uderzyłem w klawiaturę, nie ma znaczenia dla tej sprawy. – Programer

+0

Czy są jakieś inne zdarzenia, które można wykorzystać? – raznagul

Odpowiedz

-1

Spróbuj przesłać go:

char c = (char)e.KeyCode; 
+1

Nie mam kodu e.KeyCode, używam WPF. – Programer

-2
string keylog=""; // do global declaration 
//use the bellow line in event handler 
keylog= keylog + e.Key.ToString(); 
+1

Napisałem, że próbowałem tego, otrzymuję shift cntrl enuqeustion etc ...przeczytaj mój post – Programer

0

Ok Robię szereg założeń tutaj :

  1. Wartość jest wpisana w polu tekstowym.
  2. Czytnik kart używa klawisza Enter po wprowadzeniu wszystkich wartości.

Jeśli powyższe jest prawdą, można to zrobić:

private void OnKeyDownHandler(object sender, KeyEventArgs e) 
{ 
    if (e.Key == Key.Return) 
    { 
     var valueEntered = cardReaderValue.Text; 
    } 
} 
+0

nie jest to ramka tekstowa, jest programem obsługi zdarzeń dla wszystkich zdarzeń keyDown w oknie, i nie używa klucza Enter – Programer

+1

Myślę, że musisz znaleźć inne rozwiązanie, a klucz WPE KeyEventArgs nie podać wartość kluczową, taką jak wersja WinForm. –

+1

Wiem to, dlatego moje pytanie. Musi być sposób na opanowanie tego w wpf – Programer

Powiązane problemy