2011-04-11 104 views
11

在一臺電腦上,我有一個普通鍵盤和一個模擬鍵盤的條碼掃描器。當我的應用程序獲得鍵盤輸入時,如何確定輸入是來自條形碼掃描儀還是真正的鍵盤?如何判斷鍵盤輸入是否來自條形碼掃描儀?

+1

1.打開記事本。 2.在鍵盤上輸入以查看哪一個產生輸入。 – 2011-04-11 11:45:28

+0

謝謝,但我想檢查與C#代碼! – 2011-04-11 11:50:13

+0

@raha你爲什麼想這樣做? – 2011-04-11 11:52:18

回答

6

您將從兩者中獲得輸入。當然不是。它將全部放入隊列中,但Windows將處理來自兩個鍵盤的鍵盤事件。

不過,不要無可奈何。正如David Heffernan所建議的那樣,您可以通過將兩個鍵盤插入計算機,打開記事本,然後輸入隨機字符以查看哪一個生成輸入,輕鬆搞定。

您回覆說您要「用C#代碼檢查」,但我不知道這意味着什麼。如何創建一個控制檯應用程序,從鍵盤讀取輸入並將其顯示在屏幕上?

using System; 

class AdvancedKeyboardTester 
{ 
    static void Main(string[] args) 
    { 
     for (; ;) 
     { 
     Console.ReadKey(); 
     } 
    } 
} 

按下Ctrl鍵+ç你的樂趣的輪胎,想退出程序。


編輯:這聽起來像你正在尋找的RegisterRawInputDevices function,使您可以啓用所有鍵盤的原始輸入,然後通過枚舉的結果,以確定哪些設備發送的消息。

幸運的是,它看起來像有人已經寫了一個C#包裝庫此,可用於代碼項目上下載:Using Raw Input from C# to handle multiple keyboards


編輯2:(似乎的信息只是不斷從欺騙中評論)

如果您使用條形碼掃描儀,這會變得更容易。因爲它們是爲此目的而明確設計的,所以它們幾乎都是可編程的。意思是說你可以告訴他們用一些指示輸入來自條形碼掃描器的哨兵字符(而不是標準鍵盤)給它們的輸入加上前綴(和/或後綴)。 (請查閱您的條形碼掃描儀的用戶手冊,以獲取更多信息。)然後,您只需根據是否存在哨兵字符過濾掉鍵盤輸入。您還可以檢查前綴和後綴之間的字符輸入的速度。

+0

ok.you realy help me.but但我不能解決這個問題:你所要做的就是根據這些哨兵角色的存在與否來過濾掉鍵盤輸入。 – 2011-04-11 12:32:34

+0

@raha:對,基本上你可以配置掃描儀發送一些字符,基本上告訴計算機「嗨,這是我」。當您在輸入流中看到這些字符時,您知道信息來自條形碼掃描器,而不是來自用戶在鍵盤上輸入的內容。你檢查過你的條形碼掃描儀附帶的手冊嗎?它應該有更多關於這方面的信息。 – 2011-04-11 12:37:20

+0

謝謝親愛的cody gray.i終於明白了!!!我會檢查它(我沒有它!)。 – 2011-04-11 12:40:06

1

這取決於操作系統,但是您會發現,在大多數現代操作系統中,您將從兩者中同時獲得輸入。最好的方法是在你的平臺上實際嘗試它。

避免兩種人鍵入的同時;)

+0

我使用Windows XP。 – 2011-04-11 12:02:55

4

看看微軟的多點SDK

(編輯:這個答案已經不再適用現在,這個問題已經得到澄清我是。儘管將它留在這裏供其他人發現)

+0

ok.t​​hanks.but你能解釋一下微軟的MultiPoint SDK嗎? – 2011-04-11 12:02:03

+0

這是如何與**鍵盤**一起使用的? – 2011-04-11 12:03:10

+0

請參閱http://en.wikipedia.org/wiki/Windows_MultiPoint_Mouse_SDK:「通過爲每個工作站連接單個顯示器,USB 2.0集線器,鍵盤和鼠標,可將多個工作站添加到WMS 2010主機中。」 – 2011-04-11 13:41:00

1

讓一個事件監聽器檢查按鍵之間的時間延遲。條形碼掃描器將非常快速地發送擊鍵,而使用鍵盤進行人類輸入的速度相對較慢。我知道這會起作用,因爲我在Web應用程序上使用Javascript完成了這樣的事情。

我不知道C#編程,所以我剛剛給你的邏輯。快樂的一天!

0

嘗試:

Dim PreviousKeyPressTime As DateTime = Nothing 

Private Sub TextBox1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown 

    If e.KeyCode = Keys.Enter Then 
     PreviousKeyPressTime = Nothing 
     TextBox1.Text = String.Empty 
    Else 
     If PreviousKeyPressTime = Nothing Then 
      PreviousKeyPressTime = DateTime.Now 
     End If 
     Dim startTime As DateTime = Now 
     Dim runLength As Global.System.TimeSpan = startTime.Subtract(CType(Me.PreviousKeyPressTime, DateTime)) 
     Dim millisecs As Integer = runLength.Milliseconds 
     Dim secs As Integer = runLength.Seconds 
     Dim TotalMiliSecs As Integer = ((secs * 1000) + millisecs) 

     lblDiff.Text = TotalMiliSecs 

     If TotalMiliSecs <= 50 Then 
      lblMsg.Text = String.Empty 
     Else 
      lblMsg.Text = "keyboard Input not Allow" 
     End If 
     PreviousKeyPressTime = DateTime.Now 
    End If 
End Sub 

來源:http://itlearnerinsect.blogspot.com/

+1

如果你解釋你發佈的代碼,它會更好。此外,博客鏈接截至撰寫時已死亡。 – 2012-10-28 00:41:31

+0

這段代碼記錄了密鑰進入速度的快慢,如果它們太慢,它確定一個人正在輸入。無法分辨它是否真的有效,但這是代碼的意圖。 – Hucker 2014-08-13 23:04:07

0

幾乎所有的條形碼閱讀器可以用一個前綴和後綴,以任何它讀取配置。嘗試使用例如前綴「*」和後綴進行配置,然後在您的C#代碼中,每當*來自輸入流並在此文本框的lostfocus事件中強制將焦點置於一個不可見的文本框中放置所有代碼來處理條目。請注意,您選擇的前綴字符永遠不會輸入到鍵盤中。此外,將文本框的tabstop屬性設置爲false,僅用於在導航屏幕時防止用戶到達對象。祝你好運 !

1

這裏是模仿@ asif的答案。它用於WPF應用程序,在C#中已經過測試。因爲它比日期時間更準確,所以我使用了秒錶,您會在System.Diagnostics命名空間中找到它。

我想讓我的應用程序(而不是特定的文本框)焦點時捕捉文本,所以這有點不同。你會看到爲了正確處理這個問題,因爲我不知道實際字符被插入的是什麼,只有Key枚舉。由於主要關注數字1-10和那些枚舉是D1D2等,我需要時剝離D部分。

Stopwatch _inputStopwatch = new Stopwatch(); 
string _input = ""; 

private void Window_KeyUp(object sender, KeyEventArgs e) 
{ 
    if (e.Key == Key.Enter) 
    { 
     _inputStopwatch.Reset(); 
     HandleBarcode(_input); 
     _input = ""; 
    } 
    else 
    { 
     if (!_inputStopwatch.IsRunning) 
      _inputStopwatch.Start(); 
     else if (_inputStopwatch.ElapsedMilliseconds > 50) 
     { 
      _inputStopwatch.Restart(); 
      _input = ""; 
     } 

     Console.WriteLine("DEBUG: " + e.Key + " - " + _inputStopwatch.ElapsedMilliseconds + "ms"); 

     var keyString = e.Key.ToString(); 
     if (keyString.Length == 2 && keyString.StartsWith("D")) 
      keyString = keyString[1].ToString(); 

     //if (_inputStopwatch.ElapsedMilliseconds < 50) 
      _input += keyString; 
     //else 
     // _input = ""; 

     _inputStopwatch.Restart(); 
    } 
} 

private void HandleBarcode(string barcodeInput) 
{ 
    //do stuff with the barcode input 
} 
相關問題