Считывание штрих-кода с использованием 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 в файл конфигурации заключается в том, что разрабатываемое приложение будет развернуто на многочисленных ноутбуках и к ним будут подключены произвольные типы сканеров.
Кроме того, я не хочу конфигурировать сканеры с начальной и / или конечной последовательностью, которая будет выводиться, так как сканер также используется другим программным обеспечением на той же машине, и я не хочу менять код на другом программном обеспечении. Я не хочу запрограммировать устройство считывания штрих-кода в последовательном режиме либо по той же причине, что упоминалась ранее.
4 ответа
Существует способ различать клавиатуру и USB-считыватель штрих-кода
Вы можете зависеть от этих фактов:
- код, отсканированный считывателем штрих-кода, минимум 4 символа
- код, отсканированный считывателем штрих-кода, заканчивается на "ВОЗВРАТ"
- сканирование штрих-кода дырки занимает менее 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;
}
}
}
}
Здесь есть еще один вопрос о штрих-кодах, ссылка отправит вам ответ, который использует штрих-код через последовательный порт. Может быть, это решение для вас?
ИМХО: самое простое решение будет принимать ввод с клавиатуры.
Возможно, это упрощенное решение, но не могли бы вы зафиксировать событие нажатия клавиш и просто запретить ввод с клавиатуры?