2013-01-03 35 views
2

我的程序已經正常工作了,我使用TextBox來捕獲條形碼掃描器輸入。我的計劃的目的是用於時間和考勤監控,問題是我想阻止用戶使用鍵盤輸入他們的ID,因爲它會使條形碼掃描器和條形碼的ID無法使用。如何在不使用文本框的情況下從vb.net中讀取條形碼掃描器的輸入?

*我已經嘗試刪除從計算機鍵盤和它的工作,但鍵盤不能作爲一項要求被刪除...

+0

問題並不清楚你到底想要什麼。你是否將條形碼閱讀器結果顯示在文本框中,並希望用戶限制手動輸入? – Munawar

+0

是的,我想限制用戶手動輸入。是否有可能?... – curzedpirate

+0

只需將文本框ReadOnly屬性設置爲true – Munawar

回答

8

選項1以下在按鍵事件處理函數:

獲取連接到一個串行端口(COM端口讀取的原始串行裝置)的條形碼掃描儀。由於大多數條形碼掃描儀模擬鍵盤敲擊,無法直接區分條形碼掃描儀輸入和鍵盤輸入(請參閱下一個選項),而無需進入低級別(請參見上次更新)。

一個連接到串行端口(或者通過USB作爲串行端口模擬一個不再那麼常見),可以完全控制輸入來自哪裏。

選項2:通過時間輸入字符的

計數。與打字相比,條形碼掃描儀相當快地注入序列(行)。通過對按鍵進行計數來測量文本框中使用的時間(使用CR + LF作爲測量點,因爲它們也由掃描器發送)可以爲您提供一種方法來區分人類是否正在鍵入(除非有一種快速鍵入作爲f)或內容被注入。如果超時只是拒絕/清除輸入。

此外,除時間測量外,還可以使用條形碼的校驗和(如果使用包含該條形碼的條形碼)進行額外驗證。

(您可以通過覆蓋ctrl + v來檢測粘貼,如下一個選項所示)。

選項3:

聯合選項2,但代替在文本框中抽頭進給ProcessCmdKey()函數測量(通過重寫它),測量那裏,如果文本框具有焦點。這樣,您可以先緩衝輸入,測量時間,如果在設定的超時值內,則將該行插入文本框。

更新:

方案4:

這可能是一個很好的選擇,以及:
http://nicholas.piasecki.name/blog/2009/02/distinguishing-barcode-scanners-from-the-keyboard-in-winforms/

選項5:非技術方法 -

可用性改進:ma從視覺上非常清楚,必須使用掃描儀輸入條形碼,而不是打字。我包括作爲一個選項,因爲它很簡單,如果正確也是有效的(遺憾的是沒有正確的答案)。

接近可能包括f.ex.文本框中的水印(「不要輸入,掃描!」或其他順序)。給它一個不同的顏色,邊框,尺寸等以區別於普通的文本框,並且在任何時候都有相關聯的幫助文本,以提高清晰度。

+1

+1這裏有一些很好的選擇。理想的是直接連接到掃描儀,但我真的很喜歡#2作爲一個聰明的解決方案! – tcarvin

1

另一個可能的解決辦法是處理按鍵事件來限制用戶輸入。不要允許從鍵盤直接輸入,並且只允許只讀。

Private Sub Textbox1_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Textbox1.KeyPress 
     e.Handled = True 
End Sub 
+0

我正在嘗試它,但它不是工作..它也阻止來自條形碼掃描器的輸入... – curzedpirate

+0

我不知道如何條形碼閱讀器設置文本,所以,你需要採取barcodereader輸出,並設置自己的文本框文本屬性。處理Keypress事件後,它允許您從任何其他位置執行Textbox1.Text =「一些新文本」。如果可能的話共享代碼讀取條碼,那麼很容易找出一些解決方法 – Munawar

+0

這是行不通的。原因是鍵盤條碼基本上模擬鍵盤的擊鍵。這意味着沒有辦法可以區分輸入方法。我認爲最好的選擇是獲取COM部分的條形碼(或USB模擬COM)。 計時進入率的另一種方法也有缺陷。 既然你還有鍵盤,用戶可以打開記事本,在記事本中輸入用戶名,複製並粘貼到文本框中。並且由於它是COPY/PASTE,它會擊敗擊鍵率。 –

2

我有同樣的問題,我做了以下內容:

  1. 我設置一個int變量digitsPrevTyped = 0

  2. 在我的文本框的「框TextChanged」事件中,我加入這個(文本框具有17個字符的MAXSIZE):

    私人小組tbxScannedText_TextChanged(BYVAL發件人爲對象,BYVALË作爲System.EventArgs)把手tbxScannedText.TextChanged

    If tbxScannedText.Text.Length >= 17 Then 
        SearchFunction(False) 
    Else 
        digitsPrevTyped = tbxScannedText.Text.Length 
    End If 
    

    末次

  3. 然後在我的「SearchFunction」我檢查以下內容:

    Dim inputMethod As Char 
    
    If tbxScannedText.TextLength = 17 And digitsPrevTyped = 0 Then 
        inputMethod = TEXT_SCANNED 
    Else 
        inputMethod = TEXT_MANUALLY_ENTERED 
    End If 
    

如果文本框最初有0個字符的長度,目前擁有17名長度這意味着文本被掃描。如果之前輸入的文本長度小於17個字符,則輸入文本。 這是非常基本的,但它適用於我。

-2

你應該把你的文本框標記爲只讀。

+0

已經建議並且不起作用。 –

1

只需使用條形碼時,你可以禁用鍵盤不使用只讀的文本框..

的按鍵事件把一些代碼,即

如果e.keychar <> CHRW禁用鍵盤反正..( 0),則 e.keychar = CHRW(0) 端如果

該條件下將被自動觸發時用戶鍵入任何..你會強制禁用來自用戶的任何輸入而不是從條形碼

0

這是一篇舊文章,但花了一些時間才弄清楚使用條碼掃描器和組合框的相對乾淨的方式,以便將來用戶使用。

條碼掃描器通常可以配置爲在掃描結束時附加回車符和換行符。我有一個表單,可以使用_PreviewKeyDown屬性將用戶輸入或條形碼掃描器輸入轉換爲綁定組合框,並捕獲值「Keys.Enter」。

例子:

If ((e.KeyCode = Keys.Enter) Then 
'do stuff 
Else 
'do other stuff 
End if 

驗證數據存在於數據源是有點棘手,因爲組合框的SelectedValue屬性不更新,這樣不會觸發事件。我使用自定義方法來驗證掃描的值是否存在於數據源中。此方法使用組合框的.Text屬性。它使用:

Me.combobox.findexactstring(Me.combobox.Text) 
0
If e.KeyCode = Keys.Enter And txt.Text.Length > 0 Then 
    'To Do 
Else 
    'To Do 
End if 
+0

如果Asc(eventArgs.KeyChar)= 13並且txt.Text.Length> 0那麼 –

0

我所有的掃描儀輸入的進入一個「隱藏」的文本框,根據輸入的需要,然後填充可見的。這當然意味着你需要跟蹤焦點所在。任何可以獲得焦點的控件都會在這些事件中調用,以便將焦點返回到當時「活動」文本框的任何位置,這通常是隱藏的。例如...

Private Sub buttons_gotFocus(sender As System.Object, e As System.EventArgs) Handles btnPrint.GotFocus, btnInMVPageDown.GotFocus, btnAdv.GotFocus, btnManual.GotFocus, btnResend.GotFocus, dgvInbound.GotFocus, dgvOutbound.GotFocus, TCRole.GotFocus 
    Try 
     activeTextbox.Focus() 
    Catch ex As Exception 
     'ignore any errors 
    End Try 

End Sub 

大多數其他文本框默認情況下處於禁用狀態,只有在某些情況下才會啓用。一旦輸入完成,它們將被禁用,隱藏的將再次獲得焦點。奇蹟般有效。

相關問題