C# Barcode Scanner

Fou-Lu

Lt. Junior Grade
Registriert
Aug. 2006
Beiträge
290
Hallo Leute,
hätte da mal so eine Frage und hoffe ihr könnt mir weiterhelfen.

Ich habe da ein kleines Tool zur Inventarisierung und nun auch einen Barcodescanner.

Ursprünglich war es geplant, dass der Barcodescanner nur zum scannen der EAN der Produkte benutzt wird (um Zeit und Tipparbeit zu sparen).

Nun haben wir aber festgestellt, dass zum großen Teil auch Seriennummern und Produktnummern (welche ebenfalls festgehalten werden) auch als Barcode draufgedruckt werden auf der Verpackung.
Nun war mein Gedanke, dass man sich ja wirklich viel Zeit spart, wenn man auch diese schnell und bequem einscannt und nicht mühsam abtippen muss.

Da kommen wir aber auch schon zu meinem Problem und meiner Frage. Hat vielleicht jemand eine Idee wie die Erkennung des Barcodes am besten von statten gehen soll?

Aktuell hab ich nur die Funktion für den EAN-Code. Das ganze funktioniert so, dass im KeyPress-Event geprüft wird ob es sich um eine Eingabe des Scanners handelt:

Beispiel: Barcode wird eingescannt und als Tastaturanschläge übermittelt.
Aufbau der übergebenen EAN somit: **0123456789987**

Nun wird im KeyPress ein Zeichen nach dem anderen einem String-Objekt hinzugefügt. Bei jedem Anschlag wird geprüft ob der String 17 Zeichen lang ist und ob er Anfängt und Endet mit **

Sollte diese Bedingung erfüllt sein, dann handelt es sich um einen EAN-Code und er wird verarbeitet, wenn nicht dann wird die Eingabe wieder verworfen....

Es muss aber doch wohl einen besseren Weg geben um zu erkennen ob es eine Eingabe vom Scanner war oder einfach Tastaturanschläge und es dann auf EAN oder anderen Code zu unterscheiden... jemand eine Idee?? :-/
 
Reguläre Ausdrücke

Edit:
Ok nochmals gelesen. Die erleichtern nur die eigentliche Abfrage.

Also ich würde evtl im Key-Event grob so vorgehen...

Du merkst dir, ob du im EAN-Eingabe-Modus bist...

Code:
// index merkt sich die aktuelle stelle... ob das zeichen gültig ist hängt ja vom index ab

if (eanInputMode) {
  if (validEANChar(e.key, index) {
    appendChar(e.key)
    index++;

    if (index == 17) {
      // ... fertiger EAN
      eanInputMode = false;
    }
  } else {
    eanInputMode = false;
  }
}

if (!eanInputMode && isEANStartChar(e.key, 0)) {
  clearBuffer();
  appendChar(e.key);
  eanInputMode = true;
  index = 1;
}
 
Zuletzt bearbeitet:
Naja ok also die Idee mit dem Modus ist ja schon mal nicht schlecht, aber da hab ich wiederrum das Problem, dass ich erst auf einen Button klicken muss (um den Modus zu aktivieren) und erst dann den Code einscannen kann.

Das bringt mir aber leider nichts, weils dann auch keine Zeit spart :-/

Ich scan die EAN ja nur deswegen damit das vor mir liegende Produkt bereits automatisch in die Eingabemaske übernommen wird. So spar ich mir Zeit... wenn ich aber erst einen Modus aktivieren muss und dann scannen, so kann ich das Produkt in der selben Zeit aus einer Liste manuell auswählen :D


Gibt es vielleicht irgendwie eine Möglichkeit anhand der Frequenz (wie schnell der KeyPress-Event hintereinander ausgelöst wird) zu erkennen ob es nun eine Eingabe vom Scanner oder von der richtigen Tastatur war?

Ich vermute nämlich es wird keinen Menschen geben der genauso schnell tippen kann wie der Scanner seine Eingabe simuliert :D :D :D
 
ne ich meinte das innerhalb deines KeyPress-Handlers...

Eine wirklich 100% sichere Identifikation wird es kaum geben können, schließlich kann auch ein anderes Programm Key-Presses simulieren...

Und das Messen der Zeit erhöht den Aufwand eigentlich nur, und bringt kaum Mehrwert. Die Key-Events musst du ja dennoch abfangen usw...
 
Zuletzt bearbeitet:
Ja es ist mir durchaus bewusst, dass ich die KeyEvents abfangen muss, aber in erster Linie gehts mir darum, das ich den String zusammensetze und anschließend erkenne ob dieser vom Scanner kam oder manuell eingetippt wurde.

Wenn Scanner dann auswerten, wenn nicht dann ans Formular übergeben.
Wenn Scanner und Ean, führe OperationA aus, wenn Scanner und keine Ean dann ans Formular übergeben.

:D
 
Die Unterscheidung nach dem String durchzuführen ist irgenwie Grüze. :D
Ich habe mal vor genau dem gleichen Problem gestanden. Das ist allerdings schon ein paar Jahre her, daher kenn ich die Details nicht mehr. Es ist möglich, die Hardware-ID abzufragen von dem Scanner. Dazu muss man etwas in die Eingeweide von Windows abtauchen.
Dann kannst du den Scanner einmalig registrieren und dann bei jedem KeyPress-Event herausfinden von welchem Gerät das Event gefeuert wurde.
Vielleicht hilft dir das hier weiter:

http://stackoverflow.com/questions/...ish-between-multiple-input-devices-in-c-sharp
 
Zuletzt bearbeitet:
Super :)
Das bringt mich schon mal weiter ;)

Vielen Dank. Falls es was neues gibt oder ich doch noch schwierigkeiten haben sollte, melde ich mich wieder :D
 
Kann man alles machen. Die Frage bleibt, wie viel Mehrwert das bringt. :-)
 
Ok hab es jetzt doch etwas anders gelöst.
Mit einigen Abfragen und setzen einiger Flags hab ich doch noch geschafft einen unterschied zu machen ob barcode oder tastatur und ob ean oder anderweitige eingabe :p

Funktioniert auch alles einwandfrei momentan... :D :D

Danke für eure Hilfe ;)
 
Hallo,

ich hab noch zwei Ansätze für dich

1. der EAN ist immer 13 stellen lang (EAN7 mal ausgenommen) und die letzte Ziffer ist eine Prüfziffer. Wenn der Modulo stimmt kannst du dir sicher sein das es ein EAN ist. Seriennummern/Chargen werden meist als CODE39, CODE128 oder 2of5 auf Produkten aufgedruckt die haben einen anderen Modulo.

2. Kannst du die meisten Handelsüblichen Barcodescanner (>100€) per Handbuch programmieren, interessant hierbei ist der Modus die Daten nicht in den Tastaturpuffer schreiben zu lassen sondern in einen virtuellen COMport. Dann kannst du bei deinen Programm ganz einfach unterscheiden was Tastatur ist und was vom Scanner (COMport) kommt. Hochwertige Scanner können über diesen Übertragungsmodus noch mehr Daten mitteilen z.b. welchen Barcodetyp sie erkannt haben, wie die Strichcode Qualität ist uvm.


gruß joschi
 
Hallo,

den Weg über den virtuellen Com-Port hätte ich auch vorgeschlagen.
Die Geräte, die ich immer verwendet hatte, konnte man ganz einfach auf COM-Port umkonfigurieren, allerdings ist dann - zumindest unter Windows - meist die Installation eines Treibers nötig.

Gruß,
​David.
 
@ Fou-Lu:

Wäre natürlich auch nett etwas Code zu posten, für andere die ein ähnliches Problem haben.
 
Zurück
Oben