2

我的程序已经运行良好,我使用 TextBox 来捕获条形码扫描仪输入。我的程序的目的是用于时间和考勤监控,问题是我想阻止用户使用键盘输入他们的 ID,因为它会使条形码扫描仪和他们的 ID 与条形码无用。

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

4

12 回答 12

8

选项1:

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

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

选项 2:

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

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

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

选项 3:

结合选项 2,但不是在文本框中测量,而是点击 ProcessCmdKey() 函数(通过覆盖它)并在文本框有焦点时测量。这样,您可以首先缓冲输入,测量时间,如果在设定的超时值内,将行注入文本框。

更新:

选项 4:非技术方法 -

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

接近的可能包括 f.ex。文本框中的水印(“不要输入,扫描!”或按此顺序排列的内容)。给它一个不同的颜色、边框、大小等以将它与普通文本框区分开来,并有一个相关的帮助文本并随时可用,以提高清晰度。

于 2013-01-03T09:45:06.107 回答
3

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

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

  2. 在我的文本框的“TextChanged”事件中,我添加了这个(文本框的最大大小为 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
    

    结束子

  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 个字符,则该文本已被键入。这是非常基本的,但它对我有用。

于 2013-05-08T06:12:59.820 回答
1

另一种可能的解决方法是处理按键事件以限制用户输入。不允许从键盘直接输入,并将 readonly 保留为 false。

在 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
于 2013-01-03T08:27:52.723 回答
1

无论如何都只需禁用键盘..使用条形码时,您可以禁用键盘而不在文本框上使用只读..

在按键事件上放一些代码,即

如果 e.keychar <> chrw(0) 那么 e.keychar = chrw(0) 如果结束

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

于 2014-07-11T03:44:43.770 回答
1

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

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

于 2019-08-06T17:36:22.983 回答
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)
于 2015-07-23T20:42:56.727 回答
0
If e.KeyCode = Keys.Enter And txt.Text.Length > 0 Then
    'To Do
Else
    'To Do
End if
于 2016-03-22T14:20:49.047 回答
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

大多数其他文本框默认禁用,仅在特定条件下启用。完成该条目后,它们将被禁用,隐藏的条目将再次获得焦点。奇迹般有效。

于 2016-10-11T14:24:04.160 回答
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
于 2018-07-23T15:43:50.990 回答
0

这个答案将处理任何快速打字。

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
于 2019-04-17T02:38:00.520 回答
0

大多数扫描仪都有一个与之通信的驱动程序(Opos)它具有打开扫描仪端口并监听扫描的功能,因此您可以在后台获取结果并对其进行解码,然后在文本框中显示结果......什么您需要检查您的条码扫描仪的品牌,请访问其网站并下载驱动程序及其手册。

于 2021-10-11T09:19:23.440 回答
-2

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

于 2013-05-16T12:00:09.633 回答