2012-04-19 12 views
6

Tengo un lector de tarjetas magnéticas que utiliza la entrada del teclado para enviar datos. estoy usando un evento KeyDown donde consigo este objeto (C# WPF):Concat KeyDown evento (claves) para una cadena C# (wpf)

KeyEventArgs e 

quiero tomar las llaves que consigo y hacerles una cadena. Intenté concat e.Key.ToString(), pero eso no funciona. Mi entrada tiene muchos números y signos (como;? = Etc.), y la cosa e.Key.ToString() no funciona (me da D3 para un número, y MAYÚS o CTRL + otra tecla para el señales).

sólo quiero la cadena, por lo que cuando se utiliza por ejemplo Console.WriteLine voy a conseguir algo como

;51895401051=000001341? 

y no

Oem1SHIFTD1CNTRLD2D3D2D1SHIFTD9OemQuestion .... 

He intentado utilizar KeyConverter pero era incapaz de figura esto afuera.

¿Alguien puede ayudarme?

Mi controlador de eventos actual (que no funciona correctamente) es:

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

Dónde TypedText es la cadena que quiero a concat las claves. Los resultados de salida se explicaron anteriormente.


Lo resolví yo mismo. Aquí está la respuesta. La función GetCharFromKey a continuación se pone una clave (debe enviar e.Key) y devuelve un 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

Asumo en el momento en que se utilice el lector de tarjetas como emulador de teclado. ¿Tiene algún SDK que puedas usar? Por lo general, estos dispositivos incluyen controladores y API/API que puede usar en sus aplicaciones. – StaWho

+0

es solo una entrada de teclado. el hecho de que es un lector de tarjetas o simplemente un murmullo que golpeo en el teclado no importa en este caso. – Programer

+0

¿Hay algún otro evento que pueda usar? – raznagul

Respuesta

-1

Prueba a transmitir es:

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

no tengo e.KeyCode, estoy usando WPF. – Programer

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

Escribí que probé esto, recibí cambio de enrutamiento, etc ...lea mi publicación – Programer

0

Ok estoy haciendo una serie de supuestos aquí :

  1. El valor se escribe en un cuadro de texto.
  2. El lector de tarjetas usa la tecla enter cuando ha ingresado todos los valores.

Si lo anterior es cierto, usted puede hacer esto:

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

no es un cuadro de texto, es un controlador de eventos para todos los eventos KeyDown en una ventana, y no usa la tecla enter – Programer

+1

Creo que necesita encontrar una solución diferente, el WPF KeyEventArgs no lo hace proporcione el valor clave como la versión de winforms. –

+1

Lo sé, por lo tanto, mi pregunta. Debe haber una forma de lograr eso en wpf también – Programer

Cuestiones relacionadas