Ler um código de barras usando um scanner de código de barras USB, além de ignorar a entrada de dados do teclado enquanto o ID do produto e o ID do fornecedor não são conhecidos

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

  •  03-07-2019
  •  | 
  •  

Pergunta

Existe uma maneira de ler um leitor de código de barras USB enquanto ignora o teclado e não conhece o PID ou o vídeo do scanner USB? Sei que existe uma maneira de diferenciar entre a entrada do scanner USB e a entrada do teclado usando o vídeo e / ou PID do scanner USB; Isso foi feito usando código de http://nicholas.piasecki.name/blog/2009/02/distinguishing-barcode-scanners-from-the-keyboard-in-winforms/Mas existe outra solução para diferenciar entre teclado e scanner USB sem colocar o Vid ou PID do scanner em um arquivo de configuração (ou código -fonte)? O motivo para não querer colocar vários vídeos ou PIDs em um arquivo de configuração é que o aplicativo que está sendo desenvolvido será implantado em vários laptops e terá tipos arbitrários de scanners anexados a eles.

Além disso, não quero configurar o scanner com uma sequência inicial e / ou final que seria emitida, já que o scanner está sendo usado por outro software na mesma máquina e não quero alterar o código no outro software. Não quero programar o leitor de código de barras para estar no modo serial pelo mesmo motivo mencionado anteriormente.

Foi útil?

Solução

Existe uma maneira de diferenciar entre o teclado e o leitor de código de barras USB

Você pode depender desses fatos:

  1. O código digitalizado pelo leitor de código de barras em minmmum 4 caracteres
  2. O código digitalizado pelo leitor de código de barras termina com o retorno "Enter"
  3. Demora menos de 50 ms para escanear o código de barro do buraco

Este é um formulário simples usando o VS2005 VB contém:

  1. TextBox1
  2. TextBox2
  3. TextBox3
  4. Button1
  5. Timer1 "O intervalo de tempo definido como 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

Outras dicas

Bem, estou usando uma solução bonita como a do EHAB - acabei de limpar um pouco o código para o meu aplicativo. Estou usando uma classe personalizada para meus controles de edição (também está fazendo outras coisas) - mas essas são as partes importantes para isso:#

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

Há outra pergunta sobre códigos de barras aqui, o link enviará você a uma resposta que usa o código de barras por meio de uma porta serial. Talvez seja uma solução para você?

IMHO: A solução mais fácil será aceitar a entrada do teclado.

Talvez essa seja uma solução simplificada demais, mas você poderia capturar o evento de pressões de teclas e simplesmente impedir a entrada via teclado?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top