2012-04-19 9 views
6

키보드 입력을 사용하여 데이터를 보내는 자기 카드 판독기가 있습니다. 내가이 개체를 얻을 KeyDown 이벤트 (C# WPF) 사용하고 있습니다 : 내가 얻을 열쇠를 가지고 그 하나의 문자열 만들기 위해Concat KeyDown 이벤트 (키)를 하나의 C# (wpf) 문자열

KeyEventArgs e 

내가 원하는합니다. e.Key.ToString()의 연결을 시도했지만 작동하지 않습니다. 내 입력에는 숫자와 기호 (예 :; = 등)가 많이 있고 e.Key.ToString()이 작동하지 않습니다 (숫자로 D3을, Shift 또는 Ctrl + 다른 키에서 표지판).

난 그냥 문자열을 원하는, 그래서 예를 Console.WriteLine을 사용할 때 나는

;51895401051=000001341? 

하지

Oem1SHIFTD1CNTRLD2D3D2D1SHIFTD9OemQuestion .... 

같은 것을 얻을 것이다 나는 KeyConverter를 사용하여 시도하지만 그림에 없습니다 이거.

누군가 나를 도울 수 있습니까?

내 현재의 이벤트 핸들러는 (제대로 작동하지 않는)입니다 : TypedText 내가 키를 CONCAT 할 문자열입니다

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

. 출력 결과는 위에서 설명했다.


직접 해결했습니다. 여기에 답이 있습니다. 아래의 GetCharFromKey 기능은 (당신이 e.Key를 보내야합니다) 키를 가져오고 문자 반환

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

당신은 키보드 에뮬레이터로 카드 리더기를 사용합니다. 사용할 수있는 SDK가 있습니까? 일반적으로 이러한 장치에는 응용 프로그램에서 사용할 수있는 드라이버 및 컨트롤/API가 함께 제공됩니다. – StaWho

+0

그냥 키보드 입력입니다. 사실 카드 리더기이거나 키보드에 부딪히는 좀비 혼란이이 경우에는 중요하지 않습니다. – Programer

+0

사용할 수있는 다른 이벤트가 있습니까? – raznagul

답변

-1

를 캐스팅 해보십시오 :

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

e.KeyCode가 없으므로 WPF를 사용하고 있습니다. – Programer

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

나는 이것을 시도했다, 나는 교대 cntrl enuqeustion 등을 썼다 ...내 게시물을 읽으십시오 – Programer

0

내가 여기에 많은 가정을 만드는 중이라서 좋아 :

  1. 값은 텍스트 상자에 입력됩니다.
  2. 카드 판독기는 모든 값을 입력했으면 Enter 키를 사용합니다. (가) 위 사실이라면

, 당신은이 작업을 수행 할 수 있습니다

나는 순간에 가정
private void OnKeyDownHandler(object sender, KeyEventArgs e) 
{ 
    if (e.Key == Key.Return) 
    { 
     var valueEntered = cardReaderValue.Text; 
    } 
} 
+0

텍스트 상자가 아니며 창에있는 모든 keyDown 이벤트에 대한 이벤트 핸들러이며 Enter 키를 사용하지 않습니다 – Programer

+1

다른 솔루션을 찾아야한다고 생각합니다. WPF KeyEventArgs는 그렇지 않습니다. winforms 버전과 같은 키 값을 제공하십시오. –

+1

나는 그것을 알기 때문에 나의 질문입니다. 그 wchf도 acheiveing ​​방법이 있어야합니다 – Programer