Laden...

Daten von mehreren USB Barcode Lesern auslesen

Erstellt von schuppsl vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.686 Views
S
schuppsl Themenstarter:in
789 Beiträge seit 2007
vor 5 Jahren
Daten von mehreren USB Barcode Lesern auslesen

Hallo zusammen,

mit dem Thema habe ich mich noch nie beschäftigt und habe keinerlei Ahnung, deshalb die Frage 😃

Wir haben folgendes vor:

Ein Client hat 2-3 Funk-Barcodeleser angeschlossen.
D.h. also da stecken 2-3 USB-Funk Empfänger drin.

Jetzt wird wild QR Code gescannt, der z.B. Materialnummern beinhaltet.

Diese gescannten Daten sollte ich nun auslesen, gleichzeitig mit der eindeutigen ID (oder was es da auch immer gibt) des Scanners.

Daten vom Barcodescanner in ein Textfeld lesen - kein Problem.
Das Programm sollte aber im Hintergrund laufen und auf sämtliche USB Barcodeleser lauschen.

Diese Daten sollten dann "aufgefangen" werden, kommen dann in eine Datenbank usw.

Am liebsten wäre es mir, wenn es eine Library gibt, die mir ein Event wirft, wenn was gelesen wird.
Allenfalls kann das auch irgendwo in einem Zwischenspeicher landen, Textdatei oder was auch immer.
Das ganze sollte zwar zeitnah, aber nicht in Echtzeit passieren.

Gibt es so etwas?
Darf auch was kosten... 😃

Vielen Dank für Anregungen.

T
708 Beiträge seit 2008
vor 5 Jahren

Hallo schuppsl,

i.d.R. können QR-Code Leser konfiguriert werden.
In der Bedienungsanleitung stehen bestimmte Codes, mit denen das Gerät "programmiert" werden kann. So z.B. auch Start- & Endzeichen oder feste Prefixe/Suffixe.
Das könnte Dir helfen, dass Du die Scanner eindeutig identifizierbar machen kannst.

Ein Programm kann per globalen KeyHooks (Dein Stichwort für die Recherche) auf Tastatureingaben lauschen, auch ohne dass das Programm ein Eingabefeld hat oder gar im Vordergrund ist.
Ein Dienstprogramm kann imho per se nicht auf die Tastatureingaben zugreifen. Daher müsstest Du eine normale Applikation erstellen und diese dann minimiert starten (bzw. mithilfe des NotifyIcon).

2.079 Beiträge seit 2012
vor 5 Jahren

Vorweg: Ich hab keine Erfahrung mit QR-Scanner, ich kenne nur die "alten" Barcode-Scanner und arbeite auch mit Einigen. Ich denke aber nicht, dass sich da wirklich viel ändert.

Alle Barcode-Scanner, die ich bisher gesehen habe, geben sich gegenüber Windows als Tastatur aus. Der Barcode wird in Form von Tastenanschlägen übergeben, danach folgt ein Enter.
Beachte aber, wenn der Scanner eine eigene Tastatur hat und der User darauf tippt, kannst Du das nicht so einfach unterscheiden. Aber Du kannst davon ausgehen, dass ein Benutzer mehr als ein paar Millisekunden braucht um 20 Tasten zu drücken 😄

Wahrscheinlich wirst Du nicht ohne WinAPI auskommen können, also ganz super einfach wird das nicht.
Nach einer extra API würde ich nicht suchen, denn dann bist Du an den jeweiligen Hersteller gebunden und das ist meiner Erfahrung nach eine ganz schlechte Idee. Ich würde daher weiterhin darauf setzen, den Keyboard-Input zu verwenden, das ist allgemeingültig und funktioniert mit jedem Scanner.

Ich hab auf die Schnelle Folgendes gefunden: Using Raw Input from C# to handle multiple keyboards

Wenn ich das selber aufbauen müsste, würde ich mir GetRawInputDeviceList anschauen. Darüber kannst Du sehr wahrscheinlich auch die Scanner heraus filtern, was dann später helfen könnte, die Keyboard-Events voneinander zu unterscheiden.
Spannend dürfte auch SetWindowsHookEx sein, darüber kannst Du die Keyboard-Events abfangen und darauf reagieren. Da gibt's zwei Message-Typen (WH_KEYBOARD und WH_KEYBOARD_LL), die für Tastatur-Eingaben verwendet werden können.

Ach ja: pinvoke.net kann dir sehr viel Arbeit abnehmen.

Ein Dienstprogramm kann imho per se nicht auf die Tastatureingaben zugreifen. Daher müsstest Du eine normale Applikation erstellen und diese dann minimiert starten (bzw. mithilfe des NotifyIcon).

Ich bin mir fast (ist eine Weile her) sicher, dass es doch geht, aber eben nur über Hooks, die über die WinAPI registriert werden. Normalerweise passiert das bei z.B. WPF intern, allerdings funktioniert das dann nur, solange die Anwendung den Fokus hat.

PS:
Da fällt mir doch gerade Global Windows Hooks in die Arme.
Ich glaube, ich hab das Mal benutzt um die Maus global (unabhängig der Anwendung) abzufangen und es hat ganz gut funktioniert. Lustig war das Debuggen von einem solchen Hook, weil der registrierte Hook aufgerufen wird, aber nie reagiert, aber mit einem klugen Design, sollte man das natürlich automatisiert testen können.
Wenn die Library nicht hilft, dann werden in dem Artikel auf jeden Fall noch weitere WinAPI-Funktionen aufgelistet, die Du brauchen wirst.

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

S
schuppsl Themenstarter:in
789 Beiträge seit 2007
vor 5 Jahren

Vielen Dank für die konstruktiven Vorschläge.
Die werde ich mir nächste Woche mal überlegen....

D
261 Beiträge seit 2015
vor 5 Jahren

Die genaue Typbezeichnung der Barcode Scanner wäre noch interessant. Es gibt auch Modelle die können COM-Ports emulieren, dann hättest du 3 verschieden COM-Ports, die getrennt voneinander gelesen werden können. Bei der Standard Tastatursimulation kann es durchaus passieren, dass zwei Scanner gleichzeitig feuern und "ineinander" schreiben.

2.079 Beiträge seit 2012
vor 5 Jahren

Bei der Standard Tastatursimulation kann es durchaus passieren, dass zwei Scanner gleichzeitig feuern und "ineinander" schreiben.

Wenn man sozusagen einfach nur eine Textbox hat und die Scanner dort hinein schreiben.

Meine Idee war daher ein Hook und die Hoffnung, dass man dabei das Eingabe-Gerät (also die Tastatur) gesondert unterscheiden kann.
Ob das funktioniert weiß ich allerdings nicht, ein Versuch ist es aber denke ich wert.

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.