如何在不使用文本框的情况下从vb.net中的条形码扫描仪读取输入?

时间:2013-01-03 06:35:50

标签: vb.net

我的程序工作正常,我使用TextBox捕获条形码扫描仪输入。我的程序的目的是用于时间和考勤监控,问题是我想阻止用户使用键盘键入他们的ID,因为它会使条形码扫描器和他们的ID与条形码无用。

*我已经尝试从计算机上取下键盘,但它确实有效,但键盘不能作为要求删除......

11 个答案:

答案 0 :(得分:8)

选项1:

获取连接到串行端口的条形码扫描器(通过COM端口读取的原始串行设备)。由于大多数条码扫描器模拟键盘敲击,因此无法直接区分条形码扫描器输入和键盘输入(请参阅下一个选项)而不会进入低级别(请参阅上次更新)。

一个连接到串行端口(或通过USB模拟一个串行端口不再那么常见)可让您完全控制输入的来源。

选项2:

计算按时间键入的字符数。与键入相比,条形码扫描器可以非常快速地注入序列(线)。通过计算按键来测量文本框中使用的时间(使用CR + LF作为测量点,因为这些也是由扫描仪发送的)可以为您提供一种方法来区分人类是否正在键入(除非有一个人快速打字)如f)或注入的内容。如果超时,只需拒绝/清除输入。

此外,条形码的校验和(如果使用包含该条形码的条形码)可用于在时间测量之外进行额外验证。

(您可以通过覆盖ctrl + v来检测粘贴,如下一个选项中所示)。

选项3:

组合选项2但不是在文本框中使用度量来点击ProcessCmdKey()函数(通过覆盖它)并测量文本框是否具有焦点。这样,您可以先缓冲输入,测量时间,如果在设置的超时值内,则将该行注入文本框。

更新

选项4:非技术方法 -

可用性改进:在视觉上非常清楚,条形码必须使用扫描仪输入而不是键入。我包括作为一个选项,因为它很简单,如果正确也有效(不幸的是,没有正确的答案)。

接近可能包括f.ex.文本框中的水印(“不要键入,扫描!”或该顺序中的某些内容)。给它一个不同的颜色,边框,大小等,以区别于普通的文本框,并提供一个随时关联和提供的帮助文本,以提高清晰度。

答案 1 :(得分:2)

我有同样的问题,我做了以下事情:

  1. 我设置了一个int变量digitsPrevTyped = 0

  2. 在我的文本框的“TextChanged”事件中,我添加了这个(文本框的maxsize为17个字符):

    Private Sub tbxScannedText_TextChanged(ByVal sender As Object,ByVal e As System.EventArgs)处理tbxScannedText.TextChanged

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

    End Sub

  3. 然后在我的“SearchFunction”中检查以下内容:

    Dim inputMethod As Char 
    
    If tbxScannedText.TextLength = 17 And digitsPrevTyped = 0 Then 
        inputMethod = TEXT_SCANNED
    Else
        inputMethod = TEXT_MANUALLY_ENTERED
    End If
    
  4. 如果文本框最初的长度为0个字符,现在长度为17个字符,则表示文本已被扫描。如果先前键入的文本的长度小于17个字符,则键入文本。 这是非常基本的,但它适用于我。

答案 2 :(得分:1)

另一种可能的解决方法是处理keypress事件以限制用户输入。不允许从键盘直接输入并使readonly假。

在KeyPress事件处理程序

中设置以下内容
Private Sub Textbox1_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Textbox1.KeyPress
        e.Handled = True
End Sub

答案 3 :(得分:1)

无论如何都要禁用键盘..使用条形码时,您可以在不使用文本框上的只读键的情况下禁用键盘..

关于按键事件放了一些代码,即

如果e.keychar<> chrw(0)然后 e.keychar = chrw(0) 结束如果

当用户键入任何内容时,将自动触发该条件..您将强行禁用用户的任何输入,但不会禁止条形码

答案 4 :(得分: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)

答案 5 :(得分:0)

If e.KeyCode = Keys.Enter And txt.Text.Length > 0 Then
    'To Do
Else
    'To Do
End if

答案 6 :(得分:0)

我的所有扫描仪输入都进入了一个隐藏的"文本框,然后根据输入根据需要填充可见的文本框。当然,这意味着您需要跟踪焦点的位置。任何可以获得焦点的控件都将在这些事件中进行调用,以便将焦点返回到" active"文本框就在那个时候,通常是隐藏的。例如......

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

默认情况下,大多数其他文本框都处于禁用状态,并且仅在某些条件下启用。完成该条目后,它们将被禁用,隐藏的条目将再次获得焦点。像魅力一样。

答案 7 :(得分:0)

无需记录以前键入的字符。

这是我的解决方法:

Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
    If TextBox1.Text.Length >= 17 Then '17 or the number of characters your scanner gets. 
        MsgBox("scanned")
        TextBox1.Clear()
    Else
        If TextBox1.Text.Length <> 0 Then TextBox1.Clear()
    End If
End Sub

答案 8 :(得分:0)

This answer will handle any fast typing.

Dim scanner_input As Boolean = False
Dim start_typing As DateTime 

Private Sub TextBox_part_number_TextChanged(sender As Object, e As EventArgs) Handles 
 TextBox_part_number.TextChanged
    If (TextBox_part_number.Text.Length = 1) Then
        start_typing = DateTime.Now
        scanner_input = False
        ''   MsgBox(start_typing.ToString)
    ElseIf (TextBox_part_number.Text.Length > 7) Then
        If (calc_typing_time(start_typing) < 500) Then
            scanner_input = True
        Else
            scanner_input = False
        End If
    End If
End Sub
Function calc_typing_time(time_started As DateTime)
    Dim time_finished As DateTime
    time_finished = DateTime.Now
    Dim duration As TimeSpan = time_finished - time_started
    Dim time_diff As String = duration.TotalMilliseconds
    Return time_diff
End Function

答案 9 :(得分:0)

为什么在条形码中不使用“别名”,例如“ 123 @#$!”。 (但要使其变长),将其设置为“ JSMITH”,并将字体颜色设置为与文本框中的背景颜色相同。扫描时,用户看不到他们键入的内容或条形码的值。

超级简单的方法,除了在用户表中的另一个字段之外,实际上不需要添加任何内容。

答案 10 :(得分:-2)

您应该只将文本框标记为只读。