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

Есть ли способ читать с 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 в файл конфигурации заключается в том, что разрабатываемое приложение будет развернуто на многочисленных портативных компьютерах и к ним будут подключены сканеры произвольных типов.

Кроме того, я не хочу настраивать сканер с начальной и / или конечной последовательностью, которая будет выводиться, поскольку сканер также используется другим программным обеспечением на том же компьютере, и я не хочу менять код. на другом софте. Я не хочу программировать считыватель штрих-кода для работы в последовательном режиме по той же причине, упомянутой ранее.


person Amar Premsaran Patel    schedule 05.03.2009    source источник


Ответы (4)


Есть способ различать клавиатуру и USB-считыватель штрих-кода.


Исходя из следующих предположений:

  1. код, отсканированный считывателем штрих-кода, будет состоять не менее чем из 4 символов
  2. код, отсканированный считывателем штрих-кода, заканчивается нажатием клавиши 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
person Community    schedule 18.06.2009
comment
Поскольку у меня пока недостаточно репутации для редактирования постов других людей, позвольте мне перевести это для вас: предположим, что сканер введет не менее четырех символов, завершится нажатием клавиши ENTER, и на это потребуется менее 50 мс. Мне это кажется хорошей идеей, но, возможно, вам стоит вместо этого установить время в 100 мс. - person MiffTheFox; 18.06.2009
comment
Боюсь, это неверно. Вы можете определить, какое устройство создавало ввод, используя Исходный ввод. Вам также не нужно знать VID и PID, поскольку USB-сканеры имеют выделенные записи UsagePage и Usage. - person IInspectable; 09.01.2017

Что ж, я использую решение, очень похожее на решение от 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;
            }
        }
    }
}
person bernhardrusch    schedule 16.06.2010

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

person James Conigliaro    schedule 18.06.2009
comment
Сканер - это клавиатура, поэтому блокировка нажатия клавиши также заблокирует сканер. - person Chase Florell; 20.12.2010

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

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

person GvS    schedule 05.03.2009
comment
Кроме того, я не хочу настраивать сканер для работы в последовательном режиме, поскольку сканер также используется другим программным обеспечением на том же компьютере, и я не хочу, чтобы мне приходилось менять код в другом программном обеспечении. - person Amar Premsaran Patel; 05.03.2009