2012-04-19 50 views
6

キーボード入力を使用してデータを送信する磁気カードリーダーがあります。 私は、このオブジェクトを取得するKeyDownイベント(C#WPF)を使用しています:私が手に鍵を取り、それらを1つの文字列にするためにConcat KeyDownイベント(キー)から1つのC#(wpf)文字列

KeyEventArgs e 

は、私が欲しいの。 私は連結e.Key.ToString()を試みましたが、それは動作しません。私の入力はたくさんの数字と記号(?=など)を持ち、e.Key.ToString()はうまくいきません(D3に数字が与えられ、SHIFTまたはCTRL +サイン)。

私はちょうど私がKeyConverterを使用してみましたが、私は数字にできませんでした私は、例えば、Console.WriteLineを使用する場合ので、私は

;51895401051=000001341? 

なく

Oem1SHIFTD1CNTRLD2D3D2D1SHIFTD9OemQuestion .... 

のようなものを取得します、文字列をしたいですこれはアウト。

誰かお手伝いできますか? (正常に動作しません)

私の現在のイベントハンドラは、次のとおりです。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

はそれをキャストしてみてください。

[OK]を
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キーを使用します。上記trueの場合

、あなたはこれを行うことができます。

私は、現時点で想定し
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

私は、それゆえ私の質問を知っています。 wpfでもそれを達成する方法があるはずです – Programer

関連する問題