2009-03-05 49 views
11

¿Hay alguna manera de leer desde un lector de código de barras USB ignorando el teclado y sin conocer el PID o VID de el escáner USB? Sé que hay una manera de diferenciar entre la entrada del escáner USB y la entrada del teclado mediante el uso de VID y/o PID del escáner USB; esto fue hecho usando código de http://nicholas.piasecki.name/blog/2009/02/distinguishing-barcode-scanners-from-the-keyboard-in-winforms/ ¿Pero hay otra solución para diferenciar entre el teclado y el escáner USB sin poner el VID o el PID del escáner en un archivo de configuración (o código fuente)? La razón por la que no se desean colocar varios VID o PID en un archivo de configuración es que la aplicación que se está desarrollando se implementará en numerosas computadoras portátiles y se les asignarán tipos arbitrarios de escáneres.Lectura de un código de barras utilizando un escáner de código de barras USB ignorando la entrada de datos del teclado mientras no se conoce el identificador del producto del escáner y la identificación del proveedor

Además, no quiero configurar el escáner con una secuencia inicial y/o final que se generará, ya que el escáner está siendo utilizado por otro software también en la misma máquina y no quiero tener para cambiar el código en el otro software. No deseo programar el lector de código de barras para que esté en modo serie, ya sea por el mismo motivo mencionado anteriormente.

Respuesta

13

Hay una manera de diferenciar entre el lector teclado y el código de barras USB

Usted puede depender de estos hechos:

  1. el código escaneado por el lector de código de barras en minmum 4 caracteres
  2. el código escaneado por lector de código de barras finaliza con RETURN "ENTER"
  3. se tarda menos de 50 msegundos para escanear el código de barras agujero

Esta es una forma simple utilizando VS2005 VB contiene:

  1. TextBox1
  2. TextBox2
  3. TextBox3
  4. Button1
  5. Timer1 "el intervalo de tiempo ajustado a 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

Como aún no tengo suficientes representantes para editar las publicaciones de otras personas, déjeme traducirlo por usted: "Suponga que el escáner ingresará al menos cuatro caracteres, terminará con una tecla ENTRAR y tardará menos de 50 ms para hacerlo". Suena como una buena idea para mí, pero tal vez deberías hacer el tiempo 100ms en su lugar. – MiffTheFox

+0

Me temo que esto es incorrecto. Usted ** puede ** decir, qué dispositivo produjo la entrada usando [Entrada cruda] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms645536.aspx). Tampoco necesita conocer VID y PID, ya que los escáneres USB tienen entradas dedicadas * UsagePage * y * Usage * asignadas. – IInspectable

0

Hay otra pregunta sobre los códigos de barras here, el enlace le enviará a una respuesta que utiliza el código de barras a través de un puerto serie. Tal vez esa es una solución para ti?

En mi humilde opinión: La solución más fácil será aceptar la entrada desde el teclado.

+0

Además, no quiero configurar el escáner para estar en modo serie, ya que el escáner está siendo utilizado por otro software también en la misma máquina y no quiero tener que cambiar el código en el otro software. –

0

Quizás esta sea una solución demasiado simplificada, pero ¿podría capturar el evento de pulsaciones de teclas y simplemente evitar la entrada a través del teclado?

+1

un escáner es un teclado, por lo que bloquear una pulsación de tecla también bloquearía el escáner. –

3

Bueno, estoy usando una solución muy parecida a la de Ehab - Acabo de limpiar el código un poco para mi aplicación. Estoy usando una clase personalizada para mis controles de edición (que está haciendo algunas otras cosas también) - pero estas son las partes importantes para esto: #

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; 
       } 
      } 
     } 
    } 
Cuestiones relacionadas