Считывание штрих-кода с помощью USB-сканера штрих-кода и игнорирование ввода данных с клавиатуры, в то время как идентификатор продукта сканера и идентификатор производителя неизвестны

StackOverflow https://stackoverflow.com/questions/615036

  •  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»
  • сканирование штрих-кода дырки занимает менее 50 мсек
  • Это простая форма с использованием VS2005 VB содержит:

    <Ол>
  • TextBox1
  • TextBox2
  • textbox3
  • Button1
  • Таймер1 ", временной интервал установлен в 50" мс "
  • <Ч>
    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;
                    }
                }
            }
        }
    

    Есть еще один вопрос о штрих-кодах здесь , ссылка отправит вам ответ, который использует штрих-код через последовательный порт. Может быть, это решение для вас?

    ИМХО: самое простое решение - принять ввод с клавиатуры.

    Возможно, это слишком упрощенное решение, но не могли бы вы зафиксировать событие нажатия клавиш и просто запретить ввод с клавиатуры?

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top