2009-03-05 8 views
11

Gibt es eine Möglichkeit, von einem USB-Barcodeleser zu lesen, während die Tastatur ignoriert wird und die PID oder VID nicht bekannt ist der USB-Scanner? Ich weiß, dass es eine Möglichkeit gibt, zwischen USB-Scanner-Eingang und Tastatur-Eingang zu unterscheiden, indem man die VID und/oder PID des USB-Scanners verwendet; Dies wurde mit Code von http://nicholas.piasecki.name/blog/2009/02/distinguishing-barcode-scanners-from-the-keyboard-in-winforms/ getan. Gibt es eine andere Lösung, um zwischen Tastatur und USB-Scanner zu unterscheiden, ohne die VID oder PID des Scanners in eine Konfigurationsdatei (oder Quellcode) zu setzen? Der Grund dafür, dass nicht verschiedene VIDs oder PIDs in eine Konfigurationsdatei geschrieben werden sollen, liegt darin, dass die entwickelte Anwendung auf zahlreichen Laptops implementiert wird und an sie beliebige Scannertypen angeschlossen sind.Lesen eines Barcodes mit einem USB-Barcodescanner und Ignorieren der Tastaturdateneingabe, während Scanner-Produkt-ID und Hersteller-ID unbekannt sind

Auch ich möchte nicht die Scanner mit einer Start-und oder Endsequenz, die ausgegeben werden würde, da der Scanner von anderer Software auf dem gleichen Computer als auch verwendet wird, und ich will nicht zu konfigurieren um den Code auf der anderen Software zu ändern. Ich möchte den Barcodeleser nicht aus dem gleichen Grund wie zuvor beschrieben in den seriellen Modus programmieren.

Antwort

13

Es gibt einen Weg zwischen Tastatur und USB-Barcodeleser

Sie auf diesen Tatsachen abhängen können unterschieden werden: in minmum 4 Zeichen

  1. der durch Barcodeleser
  2. des von gescannten Code gescannt Code Barcodeleser endet mit RETURN "ENTER"
  3. es dauert weniger als 50 mseconds, um den Lochbarcode zu scannen

Dies ist eine einfache Form VS2005 VB enthält:

  1. textbox1
  2. TextBox2
  3. TextBox3
  4. Button1
  5. Timer1 "interval die Zeit auf 50 gesetzt" 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

Da ich nicht genug Rep haben, um die Beiträge anderer Leute zu bearbeiten, lass mich das für dich übersetzen: "Angenommen, der Scanner wird mindestens vier Zeichen eingeben, mit einem ENTER-Tastendruck beenden und dafür weniger als 50 ms benötigen." Es klingt wie eine gute Idee für mich, aber vielleicht solltest du die Zeit stattdessen 100ms machen. – MiffTheFox

+0

Ich fürchte, das ist falsch. Sie ** können ** sagen, welches Gerät Eingaben mit [Roheingabe] erzeugt hat (https://msdn.microsoft.com/en-us/library/windows/desktop/ms645536.aspx). Sie müssen auch VID und PID nicht kennen, da USB-Scannern dedizierte Einträge * UsagePage * und * Usage * zugewiesen sind. – IInspectable

0

Es gibt eine weitere Frage zu den Barcodes here, der Link wird Ihnen eine Antwort senden, die den Barcode über eine serielle Schnittstelle verwendet. Vielleicht ist das eine Lösung für dich?

IMHO: Die einfachste Lösung wird die Eingabe von der Tastatur akzeptieren.

+0

Auch ich möchte nicht, den Scanner zu konfigurieren, um in zu sein serieller Modus, da der Scanner auch von anderer Software auf demselben Rechner verwendet wird und ich den Code der anderen Software nicht ändern möchte. –

0

Vielleicht ist dies eine vereinfachte Lösung, aber könnten Sie das Ereignis "Key Press" erfassen und einfach die Eingabe über die Tastatur verhindern?

+1

Ein Scanner ist eine Tastatur. Wenn Sie also einen Tastendruck blockieren, wird der Scanner ebenfalls blockiert. –

3

Nun, ich benutze eine Lösung, die der von Ehab sehr ähnlich ist - ich habe den Code nur ein bisschen für meine Anwendung aufgeräumt. Ich bin eine benutzerdefinierte Klasse für meine Edit-Steuerelemente verwendet (es einige andere Dinge tut) - aber das sind die wichtigen Teile dafür: #

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