Lesen von USB-HID-barcode-scanner-Eingang, ohne zu wissen, VID&PID
Ich versuche zu entwickeln, Geräte-unabhängige Bibliothek für Strichcode-Scanner, es hat zu funktionieren in windows-Umgebung.
Ich habe getan, einige der Forschung in diesem Bereich, afaik sind die meisten Lösungen für dieses problem sind abhängig vom spezifischen Gerät VID&PID (RawInput @ filter von vid&pid-string), in meiner situation ist dies inakzeptabel, weil ich versuche zu entwickeln, die eine geräteunabhängige Lösung, die arbeiten werden mit einem USB-barcode-scanner.
Tatsächlich dieses Ding ist ziemlich schwierig, für mich wenigstens, sind hier genau requiriments. Auch ich kann nicht Fragen Sie den Benutzer, hot-plug-Gerät (in diesem Fall ich, konnte ich nur erkennen das angeschlossene Gerät und extrahieren Sie es in der vid/pid). Auch kann ich nicht verwenden VID&PID-Datenbank von Geräten. Im Allgemeinen kann ich nicht verwenden vid&pid eigentlich gar.
Auch ich kann nicht in irgendeiner Weise reprogramm barcode-scanner, es sei denn, es geschieht aus meinem programm (vielleicht kann ich senden einige barcodescanner-spezifische IOCTLs, die machen es die Antwort für mich?).
Derzeit werde ich vorgeschlagene Lösung in dieser Frage:
Das Lesen eines Barcodes mit einem USB-barcode-scanner zusammen mit ignorieren Tastatur Daten eingeben, während scanner-Produkt-id und vendor-id sind nicht bekannt
Außerdem habe ich gesehen, kommerzielle Bibliothek (die ist nur und kommt ohne Quellen und eine info darüber, wie es implementiert ist, aber wenn man bedenkt Sie hatte einige Wort "Performance counter" in Ihren changelogs, ich denke, Sie verwendet die Lösung in dem link oben), der wird diese Funktionalität implementiert, aber es funktioniert nicht in x64-Systemen. Wahrscheinlich entweder, weil der chaotisch-code oder beacause es verwendet wahrscheinlich irgendeine Art von filter (mini -) Fahrer. Es ist verschlüsselt und ich kann Sie nicht weiterverbreiten.
Meine genaue Frage ist:
Gibt es eine Möglichkeit zu bestimmen, dass das HID-Tastatur ist in der Tat nicht eine Tastatur, sondern einen barcode-scanner? Ich habe gesehen, auf der Win 7 x64, die es verbindet, wie Barcode-scanner, Tastatur nicht (dies war ein system Fehler, oder irgendwie so).
Genau das, was ich jetzt mache:
- Lesen Eingabe von RID_INPUTSINK.
- Unterscheidung alle Eingaben von vid&pid-Gerät
- Dass alle input-separate Puffer und sammeln von barcodes aus dem Puffer, wenn VK_ENTER zeigt auf Puffer.
Was ich gerade tun:
- Eingang Lesen von RID_INPUTSINK
- Start-timer für bestimmte Geräte und wenn das nächste symbol ist VK_ENTER - stop-timer
- Wenn der timer mehr als 50 ms limit - off es und löschen Sie alle weiteren Geräte-Eingang.
- Wenn das Gerät erfolgreich ausgelesen Folge von Zeichen aus dem ersten symbol zu VK_ENTER - Extrakt-Gerät VID&PID/Griff und mit ihm zu arbeiten in bequemer Weise (ohne timering).
Ich bin developng auf C++, Reine WinAPI, es wird eine DLL-Bibliothek, und machte sich an die Arbeit, die in Windows XP, Vista, 7, 8 auf x32-86 und x32-64-Architekturen.
UPDATE 0:
Gerade festgestellt, dass die barcode-scanner haben Ihre eigenen usagePage und-Verwendung in USB-Spezifikt.:
http://www.usb.org/developers/devclass_docs/pos1_02.pdf
Entsprechend diesem Dokument USB-Barcode-scanner haben UsagePage 0x8C und Nutzung 0x02. Leider habe ich versäumt Sie es als RAWINPUTDEVICE.dwUsage und RAWINPUTDEVICE.dwUsagePage. Wahrscheinlich, weil system installieren Sie die usb-Tastatur-Treiber drauf und im user-Modus ist es nicht von realen usb-Tastatur. Wahrscheinlich werden diese Werte nutzbar im kernelmode Umgebung (eine der Optionen ist die Entwicklung von hid filter driver).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese keine Antwort auf Ihre spezifische Frage, aber trotzdem...
Mehr als vor einem Jahr, ich implementierte barcode-reader-support unter noch mehr widrigen Umständen. Es war für ein reporting-Einsatz mit Assoziation zu logistischen Daten in Java (plattformübergreifende rich-client, in Erster Linie auf Windows).
Ich fand das gleiche aus sind Sie sagen, über den Tastatur-Treiber, die verhindert, dass die Unterscheidung von eigentlichen USB-Geräte, die im user-Modus, zumindest auf den ersten Blick. Es gibt teurere Geräte mit eigenem Treiber und erweiterte Funktionen, die es erlauben würde, eine Art von Unterscheidung.
Alle barcode-Leser, denen ich begegnete, in dieser Umgebung zu sehen waren, wie Tastaturen und einfach füllen Sie ein SAP-Formular-Feld ein und drücken Sie die enter-Taste, das ist ein üblicher Fall. Die Kündigung kann konfigurierbar sein mit 'magic Strichcodes" oder von einem anderen Hersteller spezifische Methode.
Damit war die Entscheidung gegen jede JNI-basierte, Plattform-spezifische Implementierung.
Stattdessen habe ich umgesetzt, auch eine interception-ähnlichen Ansatz (erweiterte version von Euch) durch die Auswertung von generischen keyoard Eingabe innerhalb bestimmter Swing/AWT-Formulare mithilfe dieser Kriterien:
Ruft die Eingabe verbraucht ein Puffer, bis die Kriterien für die Maschine generierten input nicht erfüllt sind, oder die Validierung erfolgreich bestanden wurde, bei dem ein barcode-Listener benachrichtigt werden. In beiden Situationen, der Eingang weitergeleitet werden kann, als wenn sonst nichts passiert.
Dies hat sich sehr genau sein, da für einen Menschen, es ist unmöglich, geben Sie eine gültige Sequenz in die barcode-Leser bewerten mit (fast) null-jitter.
EDIT:
Nur ausgegraben, der Java-Quellcode; ich kann Ihnen den code einer frühen revision der Umsetzung, die oben als ein Beispiel (ohne Garantie, betrachten Sie auch umzusetzen CR):