Lecture d'un code à barres à l'aide d'un lecteur de codes à barres USB en ignorant la saisie au clavier, sans connaître l'identificateur du produit du scanner ni celui du fournisseur

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

  •  03-07-2019
  •  | 
  •  

Question

Existe-t-il un moyen de lire à partir d’un lecteur de code-barres USB en ignorant le clavier et en ignorant le PID ou le VID du scanner USB? Je sais qu'il existe un moyen de différencier l'entrée du scanner USB et celle du clavier en utilisant le VID et / ou le PID du scanner USB; cela a été fait en utilisant le code de http://nicholas.piasecki.name/blog/2009/02/distinguishing-barcode-scanners-from-the-keyboard-in-winforms/ Mais existe-t-il une autre solution permettant de différencier le clavier et le scanner USB sans mettre le VID ou le PID du scanner dans un fichier de configuration (ou code source)? La raison de ne pas vouloir mettre divers VID ou PID dans un fichier de configuration est que l'application en cours de développement sera déployée sur de nombreux ordinateurs portables et que des types de scanneurs arbitraires y seront connectés.

De plus, je ne souhaite pas configurer le scanner avec une séquence de début et de fin qui serait émise, car le scanner est également utilisé par d'autres logiciels sur le même ordinateur et je ne veux pas être obligé de le faire. changer le code sur l'autre logiciel. Je ne souhaite pas que le lecteur de code à barres soit en mode série pour la même raison que celle mentionnée précédemment.

Était-ce utile?

La solution

Il existe un moyen de différencier le clavier du lecteur de code à barres USB

Vous pouvez vous fier à ces faits:

  1. le code scanné par le lecteur de code à barres en 4 caractères minimum
  2. le code scanné par le lecteur de code à barres se termine par RETURN "ENTRÉE"
  3. il faut moins de 50 ms pour scanner le code à barres du trou

Ceci est un formulaire simple utilisant VS2005 VB contient:

  1. textbox1
  2. textbox2
  3. textbox3
  4. Bouton1
  5. Timer1 "l'intervalle de temps défini sur 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

Autres conseils

Eh bien, j'utilise une solution assez jolie comme celle d'Ehab - je viens de nettoyer un peu le code pour mon application. J'utilise une classe personnalisée pour mes contrôles de montage (cela fait également d'autres choses) - mais ce sont les parties importantes pour cela: #

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

Il y a une autre question sur les codes à barres ici , le lien vous dirigera vers une réponse utilisant le code à barres via un port série. Peut-être que c'est une solution pour vous?

IMHO: La solution la plus simple consiste à accepter les entrées du clavier.

C’est peut-être une solution trop simpliste, mais pourriez-vous capturer l’événement des touches et empêcher tout accès au clavier?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top