Leer un código de barras usando un escáner de código de barras USB junto con ignorar la entrada de datos del teclado mientras no se conocen la identificación del producto del escáner y la identificación del proveedor

StackOverflow https://stackoverflow.com/questions/615036

  •  03-07-2019
  •  | 
  •  

Pregunta

¿Hay alguna manera de leer desde un lector de código de barras USB mientras ignora el teclado y no conoce el PID o VID del escáner USB? Sé que hay una manera de diferenciar entre la entrada del escáner USB y la entrada del teclado utilizando el VID y / o PID del escáner USB; Esto se hizo usando el 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 PID del escáner en un archivo de configuración (o código fuente)? La razón por la que no desea poner 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 tendrá tipos arbitrarios de escáneres adjuntos.

Además, no quiero configurar el escáner con una secuencia inicial o final que se generaría, ya que el escáner también está siendo utilizado por otro software en la misma máquina y no quiero tener que cambie el código en el otro software. No quiero programar el lector de código de barras para que esté en modo serie tampoco por la misma razón mencionada anteriormente.

¿Fue útil?

Solución

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

Puede confiar en 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 el lector de código de barras termina con RETURN " ENTER "
  3. se tarda menos de 50 ms para escanear el código de barras del agujero

Esta es una forma simple usando VS2005 VB contiene:

  1. textbox1
  2. textbox2
  3. textbox3
  4. Botón1
  5. Temporizador1 " el intervalo de tiempo establecido en 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

Otros consejos

Bueno, estoy usando una solución bastante 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 (también está haciendo otras cosas), 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;
                }
            }
        }
    }

Hay otra pregunta sobre códigos de barras aquí , el enlace lo enviará a una respuesta que utiliza el código de barras a través de un puerto serie. ¿Quizás es una solución para ti?

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top