2012-04-19 13 views
6

मेरे पास एक चुंबकीय कार्ड रीडर है जो डेटा भेजने के लिए कीबोर्ड इनपुट का उपयोग करता है। मैं एक KeyDown घटना है, जहां मैं इस वस्तु मिल (सी # WPF) का उपयोग कर रहा:कंसैट कीडाउन इवेंट (कीज) एक सी # (डब्ल्यूपीएफ) स्ट्रिंग

KeyEventArgs e 

मैं चाहता हूँ कुंजी है कि मैं मिल लेते हैं और उन्हें एक स्ट्रिंग बनाने के लिए। मैंने e.Key.ToString() को संक्षिप्त करने की कोशिश की, लेकिन यह काम नहीं करता है। मेरे इनपुट में बहुत सी संख्याएं और संकेत हैं (जैसे;? = आदि), और e.Key.ToString() चीज काम नहीं करती है (यह मुझे किसी संख्या के लिए डी 3 देता है, और SHIFT या CTRL + के लिए एक और कुंजी संकेत)।

मैं सिर्फ स्ट्रिंग चाहते हैं, इसलिए जब मैं उदाहरण Console.WriteLine के लिए उपयोग मैं की तरह

;51895401051=000001341? 

और नहीं

Oem1SHIFTD1CNTRLD2D3D2D1SHIFTD9OemQuestion .... 

कुछ मिल जाएगा मैं KeyConverter उपयोग करने की कोशिश, लेकिन मैं आंकड़ा करने में असमर्थ था यह बाहर है।

क्या कोई मेरी मदद कर सकता है?

मेरे वर्तमान ईवेंट हैंडलर (जो ठीक से काम नहीं करता है) है:

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

कहाँ TypedText स्ट्रिंग मैं चाबियाँ करने के लिए concat करना चाहते हैं। आउटपुट परिणाम ऊपर समझाया गया था।


मैंने इसे स्वयं हल किया। यहां जवाब है। नीचे 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

मैं इस समय मान लें कि आपके कुंजीपटल एमुलेटर के रूप में अपने कार्ड रीडर का उपयोग करें। क्या आपके पास कोई एसडीके है जिसका आप उपयोग कर सकते हैं? आमतौर पर ऐसे डिवाइस ड्राइवर और नियंत्रण/एपीआई के साथ आते हैं जिनका उपयोग आप अपने ऐप्स में कर सकते हैं। – StaWho

+0

यह सिर्फ एक कीबोर्ड इनपुट है। तथ्य यह है कि यह एक कार्ड रीडर है या सिर्फ एक गड़गड़ाहट है जिसे मैं कीबोर्ड पर हिट करता हूं, इस मामले के लिए कोई फर्क नहीं पड़ता। – Programer

+0

क्या कोई अन्य कार्यक्रम है जिसका आप उपयोग कर सकते हैं? – raznagul

उत्तर

-1

यह कास्टिंग का प्रयास करें:

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

मेरे पास ई.केकोड नहीं है, मैं 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. कार्ड रीडर सभी मानों में प्रवेश करते समय एंटर कुंजी का उपयोग करता है।

यदि उपरोक्त सच है, तो आप ऐसा कर सकते हैं:

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

पढ़ें यह एक टेक्स्ट बॉक्स नहीं है, यह एक विंडो में सभी कुंजीडाउन घटनाओं के लिए एक ईवेंट हैंडलर है, और यह एंटर कुंजी – Programer

+1

का उपयोग नहीं करता है, मुझे लगता है कि आपको एक अलग समाधान खोजने की आवश्यकता है, तो WPF KeyEventArgs नहीं करता है Winforms संस्करण की तरह कुंजी मूल्य प्रदान करें। –

+1

मुझे पता है, इसलिए मेरा सवाल है। डब्ल्यूपीएफ में – Programer

संबंधित मुद्दे