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

Есть ли способ чтения с 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 ]

13 голосов
/ 18 июня 2009

Существует возможность различать клавиатуру и USB-считыватель штрих-кода

Вы можете зависеть от этих фактов:

  1. код, отсканированный считывателем штрих-кодов, минимум 4 символа
  2. код, отсканированный считывателем штрих-кодов, заканчивается RETURN «ENTER»
  3. сканирование штрих-кода дырки занимает менее 50 мсек

Это простая форма с использованием VS2005 VB содержит:

  1. TextBox1
  2. TextBox2
  3. textbox3
  4. Button1
  5. Timer1 "интервал времени, установленный на 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
3 голосов
/ 16 июня 2010

Ну, я использую решение, похожее на решение от 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;
                }
            }
        }
    }
0 голосов
/ 18 июня 2009

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

0 голосов
/ 05 марта 2009

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

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

...