Leggere un codice a barre usando uno scanner di codici a barre USB e ignorare l'immissione di dati da tastiera mentre non sono noti ID prodotto scanner e ID fornitore

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

  •  03-07-2019
  •  | 
  •  

Domanda

Esiste un modo per leggere da un lettore di codici a barre USB ignorando la tastiera e non conoscendo il PID o il VID dello scanner USB? So che esiste un modo per distinguere tra input scanner USB e input tastiera usando il VID eo il PID dello scanner USB; ciò è stato fatto usando il codice di http://nicholas.piasecki.name/blog/2009/02/distinguishing-barcode-scanners-from-the-keyboard-in-winforms/ Ma c'è un'altra soluzione per distinguere tra tastiera e scanner USB senza inserire il VID o il PID dello scanner in un file di configurazione (o codice sorgente)? Il motivo per cui non si desidera inserire vari VID o PID in un file di configurazione è che l'applicazione in fase di sviluppo verrà distribuita su numerosi laptop e a cui sono collegati tipi arbitrari di scanner.

Inoltre, non voglio configurare lo scanner con una sequenza iniziale e / o finale che verrebbe emessa, poiché lo scanner viene utilizzato anche da altri software sulla stessa macchina e non voglio cambia il codice sull'altro software. Non voglio programmare il lettore di codici a barre in modo seriale neanche per lo stesso motivo menzionato in precedenza.

È stato utile?

Soluzione

Esiste un modo per distinguere tra tastiera e lettore di codici a barre USB

Puoi dipendere da questi fatti:

  1. il codice scansionato dal lettore di codici a barre in almeno 4 caratteri
  2. il codice scansionato dal lettore di codici a barre termina con INVIO " INVIO "
  3. ci vogliono meno di 50 msecondi per scansionare il codice a barre del foro

Questo è un semplice modulo che utilizza VS2005 VB contiene:

  1. textbox1
  2. TextBox2
  3. TextBox3
  4. Button1
  5. Timer1 "l'intervallo di tempo impostato su 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

Altri suggerimenti

Bene, sto usando una soluzione simile a quella di Ehab: ho appena ripulito il codice per la mia applicazione. Sto usando una classe personalizzata per i miei controlli di modifica (sta facendo anche altre cose) - ma queste sono le parti importanti per questo: #

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

C'è un'altra domanda sui codici a barre qui , il link ti invierà una risposta che utilizza il codice a barre tramite una porta seriale. Forse è una soluzione per te?

IMHO: la soluzione più semplice sarà accettare l'input dalla tastiera.

Forse questa è una soluzione semplificata, ma potresti catturare l'evento dei tasti premuti e semplicemente impedire l'ingresso tramite tastiera?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top