2009-03-05 10 views
11

Czy istnieje sposób odczytu z czytnika kodów paskowych USB podczas ignorowania klawiatury i nie znając PID lub VID skaner USB? Wiem, że istnieje sposób na odróżnienie wejścia skanera USB od wejścia klawiatury za pomocą VID i PID skanera USB; zostało to zrobione przy użyciu kodu od http://nicholas.piasecki.name/blog/2009/02/distinguishing-barcode-scanners-from-the-keyboard-in-winforms/ Ale czy istnieje inne rozwiązanie umożliwiające rozróżnienie klawiatury i skanera USB bez umieszczania skanera VID lub PID w pliku konfiguracyjnym (lub źródłowym)? Powodem, dla którego nie chce się umieszczać różnych VIDów lub PID w pliku konfiguracyjnym, jest to, że tworzona aplikacja zostanie wdrożona na wielu laptopach i do której podłączone są dowolne typy skanerów.Odczytywanie kodu kreskowego za pomocą skanera kodów kreskowych USB oraz ignorowanie wprowadzania danych z klawiatury podczas gdy identyfikator produktu skanera i identyfikator dostawcy są nieznane

Ponadto, nie chcę konfigurować skanera z wyjściową i końcową sekwencją, która byłaby wyprowadzana, ponieważ skaner jest używany przez inne oprogramowanie na tym samym komputerze, a ja nie chcę mieć aby zmienić kod na innym oprogramowaniu. Nie chcę programować czytnika kodów paskowych w trybie szeregowym z tego samego powodu, o którym wspominałem wcześniej.

Odpowiedz

13

Jest sposób odróżnić czytnika klawiatury i kodów kreskowych USB

Możesz polegać na tych faktach:

  1. kod skanowana przez czytnik kodów kreskowych w minmum 4 znaków
  2. kod skanowane przez czytnik kodów kreskowych kończy się RETURN "ENTER"
  3. trwa mniej niż 50 milisekund, aby zeskanować kod paskowy otworu

to prosta forma pomocą VS2005 VB zawiera:

  1. TextBox1
  2. TextBox2
  3. textbox3
  4. Przycisk1
  5. Timer1 "przedział czasu ustawionego na 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 
+0

Ponieważ nie mam wystarczającej liczby przedstawicieli, aby edytować posty innych osób, po prostu pozwól mi przetłumaczyć to dla ciebie: "Załóżmy, że skaner wprowadzi co najmniej cztery znaki, zakończy się naciśnięciem klawisza ENTER, i zrobi to poniżej 50 ms". To dla mnie dobry pomysł, ale może powinieneś zrobić czas na 100ms. – MiffTheFox

+0

Obawiam się, to jest nieprawidłowe. Ty ** możesz ** powiedzieć, które urządzenie wyprodukowało dane wejściowe przy użyciu [Raw Input] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms645536.aspx). Nie musisz też znać VID i PID, ponieważ skanery USB mają dedykowane wpisy * UsagePage * i * Usage *. – IInspectable

0

Jest jeszcze jedno pytanie dotyczące kodów kreskowych here, link wyśle ​​Ci odpowiedź, która używa kodu kreskowego poprzez port szeregowy. Może to rozwiązanie dla ciebie?

IMHO: Najprostszym rozwiązaniem będzie akceptacja danych wejściowych z klawiatury.

+0

Ponadto, nie chcę, aby skonfigurować skaner być w tryb seryjny, ponieważ skaner jest używany również przez inne oprogramowanie na tym samym komputerze i nie chcę zmieniać kodu w innym oprogramowaniu. –

0

Być może jest to uproszczone rozwiązanie, ale czy można uchwycić najważniejsze zdarzenie prasowe i po prostu uniemożliwić wejście za pomocą klawiatury?

+1

skaner jest klawiaturą, więc zablokowanie naciśnięcia klawisza również zablokuje skaner. –

3

Cóż, używam rozwiązania podobnego do tego z Ehab - po prostu wyczyściłem kod dla mojej aplikacji. Używam niestandardowej klasy dla moich edycji kontroli (robi kilka innych rzeczy też) - ale są to ważne elementy dla tego: #

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; 
       } 
      } 
     } 
    } 
Powiązane problemy