2013-01-17 49 views
2

我有一個應用程序,從健康卡讀取數據並解析他們的基本信息,如D.O.B.,Health Card#和名稱。現在,我有一個文本框,可以從刷卡器中獲取輸入信息,並且效果很好,但是我覺得可能有更好的方法。捕獲沒有文本框的鍵盤輸入

我想在應用程序的背景中有一個鍵盤監聽器,它捕獲卡片掃描器的輸入並解析數據而不需要文本框。我想我需要在Form1_Load中有一個循環函數,它主動偵聽鍵盤輸入,爲輸入準備一個緩衝區,然後當檢測到回車時,繼續解析緩衝的數據。解析完成後,清除緩衝區。

我的問題是我相對較新的C#,我不知道我應該用什麼來聽鍵盤輸入沒有文本框。有人能指出我正確的方向嗎?

這裏是我的情況下,代碼,如果任何人的興趣:http://pastebin.com/q6AkghvN

剛一說明,我也跟着從 http://www.markhagan.me/Samples/CreditCardSwipeMagneticStripProcessing信用卡刷卡指南和修改了它稍微對我的用例。

---編輯---

感謝保羅和其他人的幫助!

這裏是我的解決方案,如果有人有興趣:

private void frmMain_KeyPress(object sender, KeyPressEventArgs e) 
    { 
     lblStatus.Text = "Reading Card..."; 
     lblStatus.ForeColor = Color.Blue; 
     if (e.KeyChar != (char)Keys.Enter) 
     { 
      buffer += e.KeyChar; 
     } 
     else 
     { 
      lblStatus.Text = "Parsing Card..."; 
      if (buffer.Contains('^') && buffer.Contains(';') && buffer.Contains('=')) 
      { 
       try 
       { 
        string[] cardData = buffer.Split(';'); 
        string[] caretData = cardData[0].Split('^'); 
        string[] nameData = caretData[1].Split('/'); 
        string[] equalData = cardData[1].Split('='); 
        tBoxHealthCardNumber.Text = equalData[0]; 
        tBoxDateOfBirth.Text = FormatBirthday(equalData[1]); 
        tBoxFirstName.Text = TrimName(nameData[1]); 
        tBoxLastName.Text = TrimName(nameData[0]); 
        tBoxDateTimeScanned.Text = DateTime.UtcNow.ToString("yyyy/MM/dd HH:mm"); 
        e.Handled = true; 
       } 
       catch (Exception) 
       { 
        throw; 
       } 
      } 
      else 
      { 
       lblStatus.Text = "Error Reading Card"; 
      } 

      buffer = ""; 
      lblStatus.Text = "Ready"; 
      lblStatus.ForeColor = Color.Green; 
     } 
    } 
+0

我不確定表單上的按鍵事件是否會檢測到滑動,但您可以試試 – AbZy

+0

我只是在查看您的代碼,卡讀取器實際發送數據的位置? –

+0

@ Shane.C從我的理解中,許多讀卡器充當鍵盤:它們將數據發送到鍵盤上,就好像它已經鍵入了鍵盤一樣。我相信條形碼掃描儀也傾向於以這種方式工作。 –

回答

3

如果添加一鍵處理程序的形式,你將看不到按鍵時,重點是控制,例如一個文本框。即使在有焦點控制的情況下,如果要查看按鍵,您還必須啓用KeyPreview屬性。

然後,您可以在窗體上添加KeyDown,KeyPress和/或KeyUp的處理程序,以便接收這些事件。

正如你可以在文檔中讀取KeyPreview,如果你設置了Handled屬性爲true,則可以防止事件隨後被髮送到集中控制,即您可以從由聚焦被視爲隱藏某些關鍵事件控制。

+0

也許更好的方法是捕獲Keydown和Keyup的窗口事件,這樣即使應用程序不在頂層,您也可以捕獲和輸出。 – CodingBarfield

+0

謝謝!我認爲這可能是我正在尋找的答案。 – Craig