2009-03-05 1 views
11

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

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

ответ

13

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

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

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

Это простая форма с помощью VS2005 VB содержит:

  1. TextBox1
  2. TextBox2
  3. textbox3
  4. Button1
  5. Таймер1 "интервал времени установлен в 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 
+0

Поскольку у меня нет достаточного количества сообщений для редактирования сообщений других людей, просто позвольте мне перевести это для вас: «Предположим, что сканер вводит не менее четырех символов, заканчивая нажатием клавиши ENTER и занимает менее 50 мс для этого». Для меня это звучит неплохо, но, возможно, вам стоит сделать это на 100 мс вместо этого. – MiffTheFox

+0

Боюсь, это неверно. Вы можете ** указать, какое устройство было введено с помощью [Исходный вход] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms645536.aspx). Вам также не нужно знать VID и PID, поскольку USB-сканеры имеют выделенные * UsagePage * и * Usage * записи. – IInspectable

0

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

IMHO: Самое простое решение будет принимать ввод с клавиатуры.

+0

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

0

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

+1

сканер - это клавиатура, поэтому блокировка нажатия клавиши блокирует сканер. –

3

Ну, я использую решение, похожее на решение от 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; 
       } 
      } 
     } 
    } 
Смежные вопросы