使用USB条形码扫描仪读取条形码,同时忽略键盘数据输入,而扫描仪产品ID和供应商ID未知

时间:2022-03-15 23:15:59

Is there a way to read from a USB barcode reader while ignoring the keyboard and not knowing the PID or VID of the USB scanner? I know that there is a way of differentiating between USB scanner input and keyboard input by using the VID and or PID of the USB scanner; this was done using code from http://nicholas.piasecki.name/blog/2009/02/distinguishing-barcode-scanners-from-the-keyboard-in-winforms/ But is there another solution to differentiate between keyboard and USB scanner without putting the scanner's VID or PID in a configuration file (or source code)? The reason for not wanting to put various VIDs or PIDs in a configuration file is that, the application being developed will be deployed on numerous laptops and have arbitrary types of scanners attached to them.

有没有办法从USB条形码阅读器读取而忽略键盘而不知道USB扫描仪的PID或VID?我知道有一种方法可以通过使用USB扫描仪的VID和/或PID来区分USB扫描仪输入和键盘输入;这是使用http://nicholas.piasecki.name/blog/2009/02/distinguishing-barcode-scanners-from-the-keyboard-in-winforms/中的代码完成的。但是有另一种解决方案来区分键盘和USB扫描仪不将扫描仪的VID或PID放在配置文件(或源代码)中?不想在配置文件中放置各种VID或PID的原因是,正在开发的应用程序将部署在众多笔记本电脑上,并且附加了任意类型的扫描仪。

Also, I don't want to configure the scanner's with a starting and or ending sequence that would be outputted, since the scanner is being used by other software on the same machine as well and I don't want to have to change the code on the other software. I don't want to program the barcode reader to be in serial mode either for the same reason mentioned previously.

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

4 个解决方案

#1


There is a way to differentiate between keyboard and USB barcode reader

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

You can depend on these facts:

你可以依赖这些事实:

  1. the code scanned by barcode reader in minmum 4 characters
  2. 条形码阅读器扫描的代码最少4个字符

  3. the code scanned by barcode reader ends with RETURN "ENTER"
  4. 条形码阅读器扫描的代码以RETURN“ENTER”结束

  5. it take less than 50 mseconds to scan the hole barcode
  6. 扫描孔条形码需要不到50毫秒

This is a simple form using VS2005 VB contains:

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

  1. textbox1
  2. textbox2
  3. textbox3
  4. Button1
  5. Timer1 "the time interval set to 50"ms"
  6. 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

#2


Well, I am using a solution pretty like the one from Ehab - I just cleaned up the code a little bit for my application. I am using a custom class for my edit controls (it is doing some other things too) - but these are the important parts for this:#

好吧,我使用的解决方案非常类似于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;
                }
            }
        }
    }

#3


There is a another question about barcodes here, the link will send you to an answer that uses the barcode via a serial port. Maybe that's a solution for you?

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

IMHO: The most easy solution will be accepting the input from the keyboard.

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

#4


Perhaps this is an oversimplified solution, but could you capture the key presss event and simply prevent entry via keyboard?

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

#1


There is a way to differentiate between keyboard and USB barcode reader

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

You can depend on these facts:

你可以依赖这些事实:

  1. the code scanned by barcode reader in minmum 4 characters
  2. 条形码阅读器扫描的代码最少4个字符

  3. the code scanned by barcode reader ends with RETURN "ENTER"
  4. 条形码阅读器扫描的代码以RETURN“ENTER”结束

  5. it take less than 50 mseconds to scan the hole barcode
  6. 扫描孔条形码需要不到50毫秒

This is a simple form using VS2005 VB contains:

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

  1. textbox1
  2. textbox2
  3. textbox3
  4. Button1
  5. Timer1 "the time interval set to 50"ms"
  6. 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

#2


Well, I am using a solution pretty like the one from Ehab - I just cleaned up the code a little bit for my application. I am using a custom class for my edit controls (it is doing some other things too) - but these are the important parts for this:#

好吧,我使用的解决方案非常类似于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;
                }
            }
        }
    }

#3


There is a another question about barcodes here, the link will send you to an answer that uses the barcode via a serial port. Maybe that's a solution for you?

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

IMHO: The most easy solution will be accepting the input from the keyboard.

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

#4


Perhaps this is an oversimplified solution, but could you capture the key presss event and simply prevent entry via keyboard?

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