使用 USB 条码扫描仪读取条码并忽略键盘数据输入,同时扫描仪产品 ID 和供应商 ID 未知
-
03-07-2019 - |
题
有没有一种方法可以在忽略键盘且不知道 USB 扫描仪的 PID 或 VID 的情况下从 USB 条形码阅读器读取数据?我知道有一种方法可以通过使用USB扫描仪的VID和/或PID来区分USB扫描仪输入和键盘输入;这是使用代码完成的 http://nicholas.piasecki.name/blog/2009/02/distinguishing-barcode-scanners-from-the-keyboard-in-winforms/但是,是否有另一种解决方案可以区分键盘和 USB 扫描仪,而无需将扫描仪的 VID 或 PID 放入配置文件(或源代码)中?不想将各种 VID 或 PID 放入配置文件中的原因是,正在开发的应用程序将部署在许多笔记本电脑上,并附加任意类型的扫描仪。
另外,我不想用要输出的开始和/或结束序列来配置扫描仪,因为扫描仪也被同一台机器上的其他软件使用,并且我不想更改代码在其他软件上。出于与前面提到的相同原因,我不想将条形码读取器编程为串行模式。
解决方案
有一种方法可以区分键盘和 USB 条形码阅读器
您可以依赖以下事实:
- 条形码阅读器扫描的代码最少 4 个字符
- 条形码阅读器扫描的代码以 RETURN“ENTER”结束
- 扫描孔条码耗时不到50毫秒
这是一个使用VS2005 VB的简单表格包含:
- 文本框1
- 文本框2
- 文本框3
- 按钮1
- Timer1“时间间隔设置为50”ms”
Public Class Form1
Dim BarcodeStr As String = ""
Dim IsBarcodeTaken As Boolean = False
Dim Str As String = ""
Dim str3 As String = ""
Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
If Timer1.Enabled = False Then
Str = TextBox1.Text
str3 = TextBox3.Text
End If
End Sub
Private Sub Form1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Me.KeyPress
If Timer1.Enabled = False Then
Timer1.Enabled = True
End If
BarcodeStr = BarcodeStr & e.KeyChar
If Asc(e.KeyChar) = 13 And Len(BarcodeStr) >= 4 Then
IsBarcodeTaken = True
TextBox2.Text = BarcodeStr
End If
End Sub
Private Sub Form1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyUp
If IsBarcodeTaken = True Then
TextBox1.Text = Str
TextBox1.Select(Len(TextBox1.Text), 0)
Str = ""
TextBox3.Text = str3
TextBox3.Select(Len(TextBox3.Text), 0)
str3 = ""
End If
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
BarcodeStr = ""
IsBarcodeTaken = False
Timer1.Enabled = False
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
TextBox2.Text = ""
End Sub
End Class
其他提示
好吧,我使用的解决方案非常类似于Ehab的解决方案 - 我只是为我的应用程序清理了一些代码。我正在为我的编辑控件使用自定义类(它也在做其他一些事情) - 但这些是这个的重要部分:#
public class ScannerTextBox : TextBox
{
public bool BarcodeOnly { get; set; }
Timer timer;
private void InitializeComponent()
{
this.SuspendLayout();
this.ResumeLayout(false);
}
void timer_Tick(object sender, EventArgs e)
{
if (BarcodeOnly == true)
{
Text = "";
}
timer.Enabled = false;
}
protected override void OnKeyPress(KeyPressEventArgs e)
{
base.OnKeyPress(e);
if (BarcodeOnly == true)
{
if (timer == null)
{
timer = new Timer();
timer.Interval = 200;
timer.Tick += new EventHandler(timer_Tick);
timer.Enabled = false;
}
timer.Enabled = true;
}
if (e.KeyChar == '\r')
{
if (BarcodeOnly == true && timer != null)
{
timer.Enabled = false;
}
}
}
}
还有一个关于条形码的问题这里,该链接将发送给您通过串行端口使用条形码的答案。也许那是你的解决方案?
恕我直言:最简单的解决方案是接受键盘的输入。
也许这是一个过于简单的解决方案,但您是否可以捕获按键事件并阻止通过键盘输入?
不隶属于 StackOverflow