2012-04-19 28 views
6

Tôi có đầu đọc thẻ từ sử dụng đầu vào bàn phím để gửi dữ liệu. Tôi đang sử dụng một sự kiện KeyDown nơi tôi có được đối tượng này (C# WPF):Sự kiện KeyDown Concat (Phím) cho một chuỗi C# (wpf)

KeyEventArgs e 

Tôi muốn lấy chìa khóa mà tôi nhận được và làm cho họ một chuỗi. Tôi đã cố gắng để concat e.Key.ToString(), nhưng điều đó không hoạt động. Đầu vào của tôi có rất nhiều con số và dấu hiệu (chẳng hạn như;? = Etc.) và điều e.Key.ToString() không hoạt động (nó mang lại cho tôi D3 cho một số, và SHIFT hoặc CTRL + một khóa khác cho dấu hiệu).

Tôi chỉ muốn chuỗi, vì vậy khi tôi sử dụng ví dụ Console.WriteLine tôi sẽ nhận được một cái gì đó giống như

;51895401051=000001341? 

và không

Oem1SHIFTD1CNTRLD2D3D2D1SHIFTD9OemQuestion .... 

tôi đã cố gắng sử dụng KeyConverter nhưng tôi đã không thể hình điều này.

Ai đó có thể giúp tôi không?

xử lý sự kiện hiện tại của tôi (mà không hoạt động đúng) là:

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

đâu TypedText là chuỗi Tôi muốn concat những chìa khóa để. Kết quả đầu ra đã được giải thích ở trên.


Tôi tự giải quyết. Đây là câu trả lời. Các GetCharFromKey chức năng dưới đây được Key (bạn nên gửi e.Key) và trả về một 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

tôi giả sử tại thời điểm bạn sử dụng đầu đọc thẻ của bạn như giả lập bàn phím. Liệu nó có bất kỳ SDK nào bạn có thể sử dụng không? Thông thường các thiết bị như vậy đi kèm với các trình điều khiển và các API/điều khiển bạn có thể sử dụng trong các ứng dụng của mình. – StaWho

+0

nó chỉ là một đầu vào bàn phím. thực tế là nó là một đầu đọc thẻ hoặc chỉ là một mớ lộn xộn lộn xộn tôi nhấn trên bàn phím không quan trọng cho trường hợp này. – Programer

+0

Bạn có thể sử dụng bất kỳ sự kiện nào khác không? – raznagul

Trả lời

-1

Hãy thử đúc nó:

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

tôi không có e.KeyCode, tôi đang sử dụng WPF. – Programer

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

Tôi đã viết rằng tôi đã thử này, tôi nhận được sự thay đổi cntrl enuqeustion vv ...đọc bài viết của tôi – Programer

0

Ok Tôi đang thực hiện một số giả định ở đây :

  1. Giá trị được nhập vào hộp văn bản.
  2. Trình đọc thẻ sử dụng phím enter khi nó đã nhập tất cả các giá trị.

Nếu ở trên là đúng, bạn có thể làm điều này:

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

nó không phải là một hộp văn bản, nó là một xử lý sự kiện cho tất cả các sự kiện keyDown trong một cửa sổ, và nó không sử dụng phím enter – Programer

+1

Tôi nghĩ rằng bạn cần phải tìm một giải pháp khác nhau, WPF KeyEventArgs không cung cấp giá trị được khóa như phiên bản winforms. –

+1

Tôi biết rằng, do đó câu hỏi của tôi. Phải có một cách để đạt được điều đó trong wpf cũng như – Programer

Các vấn đề liên quan