12

有没有办法在忽略键盘且不知道 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 放在配置文件中的原因是,正在开发的应用程序将部署在许多笔记本电脑上,并附有任意类型的扫描仪。

另外,我不想使用将输出的开始和或结束序列配置扫描仪,因为扫描仪也被同一台机器上的其他软件使用,我不想更改代码在其他软件上。出于前面提到的相同原因,我也不想将条形码阅读器编程为串行模式。

4

4 回答 4

14

有一种方法可以区分键盘和 USB 条码阅读器


从以下假设开始:

  1. 条码阅读器扫描的代码长度至少为 4 个字符
  2. 条码阅读器扫描的代码以“ENTER”键结束
  3. 传输整个条码不到 50 毫秒

这个使用 VS2005 VB 的简单表格包含:

  1. 文本框1
  2. 文本框2
  3. 文本框3
  4. 按钮1
  5. Timer1“时间间隔设置为50ms”

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
于 2009-06-18T12:00:25.410 回答
3

好吧,我使用的解决方案与 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;
            }
        }
    }
}
于 2010-06-16T13:12:14.390 回答
0

这里还有一个关于条形码的问题,该链接会将您发送到通过串行端口使用条形码的答案。也许这对你来说是一个解决方案?

恕我直言:最简单的解决方案是接受键盘输入。

于 2009-03-05T14:47:40.487 回答
0

也许这是一个过于简单的解决方案,但是您能否捕获按键事件并简单地阻止通过键盘输入?

于 2009-06-18T12:06:33.293 回答