Barcode Scanner Eingabe abfangen

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von dive26.

    Barcode Scanner Eingabe abfangen

    Hallo Forum Gemeinde,
    ich habe einen Barcode Scanner (USB) von welchem ich gerne den gescannten Barcode abfangen würde, währen die Applikation im Hintergrund ist.
    Derzeit habe ich das so gelöst:
    Der Scanner sendet mir ein Prefix (ESC) das fange ich über einen KeyHook ab.
    Dann bringe ich meine Applikation in den Vordergrund und setze den Focus auf eine Textbox.
    Am Ende gibt mir der Scanner ein Enter als Suffix.
    Das fange ich wieder über einen KeyHook ab und verarbeite dann den Barcode.
    So weit so gut. Leider ist der Scanner ab und an schneller als die Applikation und somit bekommt die nicht den ganzen Barcode mit.
    Ist die Applikation schon offen, dann funktioniert das einwandfrei.

    Habt ihr eine Idee wie ich das alles im Hintergrund machen kann?
    Mein Gedanke ist so:

    Wenn ESC dann alles weitere als stream abfangen und wenn ENTER dann den Stream verarbeiten.
    Leider fehlt mir irgendwie ein Ansatz wie ich das machen kann.

    Besten Dank
    Kiter20
    "Mann" lernt mit seinen Projekten.

    kiter20 schrieb:

    Habt ihr eine Idee wie ich das alles im Hintergrund machen kann?
    Üblicherweise haben die Barcodescanner einen Spezial-Treiber, der es gestattet, ihn als SerialPort zu implementieren.
    In diesem Context kannst Du ohne Hool und solch die Informatikon im DataReceived-Event empfangen.
    Wende Dich an die Firma, die den Barcodescanner vertreibt
    oder
    sieh im Handbuch nach.
    Ggf. ist da ein Barcode abgebildet, der beim Scannen diese Umschaltung vornimmt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ja, das geht bestimmt, diesen Lösungsansatz habe ich schon gesehen und in Betracht gezogen.
    Das wäre auch meine Notlösung.
    Ich würde das aber gerne anders lösen, ohne einen Treiber zu installieren.
    Wenn sich natürlich herausstellt, dass das nicht möglich ist, dann bleibt mir natürlich nichts anderes übrig.
    "Mann" lernt mit seinen Projekten.

    kiter20 schrieb:

    Das wäre auch meine Notlösung.
    Das ist die Standard-Lösung!
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi

    Die meisten Barcodescanner werden von Windows als HID-Device (Tastatur) erkannt. Setz den Focus auf eine Textbox, scann was mit dem Barcodescanner und dann sollte in der TB eine Zahlen/Buchstaben-Kombination auftauchen. Wenn das funktioniert ist die halbe Miete schon drin. Der Rest wäre, erkennen ob Tastaturereignisse von der normalen Tastatur oder vom Barcodescanner kommen. Bei einigen Barcodescannern kann man einen Pre- und Post-Zeichen setzen, das so nicht einfach auf der normalen Tastatur eingegeben werden kann, das man für die Erkennung, ob das nun vom Barcodescanner kommt, verwenden kann.

    Vllt gibt es auch eine Möglichkeit zu erkennen, von welchem HID-Device die Zeichenkette/Tastaturanschläge kommen.

    Besser wäre natürlich, wie RodFromGermany schon angemerkt hat, wenn zum Barcodescanner Treiber, APIs oder SDKs zur Verfügung stehen.
    Mfg -Franky-
    Ich hatte schon einige Barcodescanner in der Hand, und alle haben als SerialPort-Gerät funktioniert.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    und alle haben als SerialPort-Gerät funktioniert

    Ja, da gebe ich dir Recht.
    Ich werde das auch probieren. Aber...
    Mich würde es interessieren, wie man diesen vom Scanner gesendeten Stream bzw. Abfolge von Tastatureingaben
    abfangen kann. Quasi eine Alternative zur Textbox.
    Natürlich würde das auch über GetAsyncKeyState gehen. Ich kann das ESC Prefix nutzen um den Timer zu starten.
    Wenn ich das mit GetAsyncKeyState mache, muss ich ja jede Taste auswerten? (Bitte korrigiert mich)
    Wie unterscheide ich zwischen groß und klein? (Ev. kennt jmd. einen guten Beitrag zu dem Thema)
    Eventuell gibt es ja einen einfachen Weg, so wie mit der Textbox.
    "Mann" lernt mit seinen Projekten.

    kiter20 schrieb:

    Natürlich würde das auch über GetAsyncKeyState gehen.
    Nö.
    GetAsyncKeyState() gibt Dir so was wie [Wahr] zurück, wenn Du abfragst, ob genau die eine Taste in diesem Moment gedrückt ist.
    Damit kannst Du z.B. abfragen, ob bei einem Button-Click gleichzeitig die "Alt"-Taste gedrückt ist.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi

    kiter20 schrieb:

    Mich würde es interessieren, wie man diesen vom Scanner gesendeten Stream bzw. Abfolge von Tastatureingaben abfangen kann

    Die TextBox war hier nur ein Bsp. ob der Barcodescanner als HID-Device (Tastatur) erkannt wird. Hier müsste man sich überlegen, wie würde ein Treiber das machen. Lassen wir mal die Erstellung eines virtuellen COM Ports außen vor und das dieser auf einer anderen Ebene arbeitet als Dein Programm. Man könnte nun auf die Idee kommen einen globalen Keyboardhook einzusetzten. Da gibt es eine API für. Brauchst Du aber nicht da Du das in .NET auch so in der Form abfangen könntest.

    VB.NET-Quellcode

    1. Protected Overrides Function ProcessCmdKey(ByRef msg As Message, ByVal keyData As Keys) As Boolean
    2. Select Case keyData
    3. ' Taste(n) auf die reagiert werden soll
    4. Case Keys.Space ' <- als Bsp für einen Pre zum erkennen das das vom Scanner kommt
    5. ' irgendwas starten bis der Post kommt, alles was zwischen Pre und Post liegt,
    6. ' gehört zum Scanner und könnte hier ausgewertet bzw. die Weiterleitung unterdrückt werden.
    7. ' Weiterleitung der Message unterbinden
    8. Return True
    9. End Select
    10. ' Alle anderen Tasten und Messages weiterleiten
    11. Return MyBase.ProcessCmdKey(msg, keyData)
    12. End Function

    So würde ein Treiber aber nicht arbeiten. Wenn dann schon eher das der Treiber direkt mit dem HID-Device kommuniziert. Aber woher weis der Treiber mit welchem angeschlossenem HID-Device er kommunizieren soll? Nun da wären die VendorID und ProductID die für jedes Gerät eindeutig sind. Entweder der Treiber lauscht ständig im System bis ein entsprechendes HID-Device angeschlossen wird bzw. durchläuft alle angeschlossenen HID-Devices und schaut nach der passenden VID/PID und baut dann eine entsprechende Verbindung zum Device auf um Daten auszulesen oder auch zu schreiben.

    Mit diesen Infos bzw mit den passenden Suchbegriffen solltest Du auch diverse Bsp. im Internet finden. Da kommt sicher einiges an APIs (DeviceIoControl, CreateFile, diverse Funktionen aus der setupapi.dll usw.) zusammen. Bist Du Dir sicher das Du das selbst programmieren möchtest?
    Mfg -Franky-

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „-Franky-“ ()

    -Franky- schrieb:

    Bist Du Dir sicher das Du das selbst programmieren möchtest?

    Naja, deswegen habe ich ja diesen Thread gemacht, um das Ausmaß abzuschätzen. :)

    Deine obige Funktion funktioniert ja nur wenn die Applikation aktiv ist. Somit würde ich diese mit dem KeyHook scharf schalten.
    Und dann einfach jede Taste abfangen. Ein erster Test gefällt mir schon ganz gut
    Jetzt muss ich es nur hinbekommen, dass ich auch wirklich das Zeichen bekomme, was dort gedrückt wurde, incl. Groß- und
    Kleinschreibung.
    Gerne nehme ich hier auch Tipps an. Sonst suche ich natürlich selber.

    An dieser Stelle aber schon einmal besten Dank und ein schönes Wochenende!
    "Mann" lernt mit seinen Projekten.

    kiter20 schrieb:

    Jetzt muss ich es nur hinbekommen, dass ich auch wirklich das Zeichen bekomme, was dort gedrückt wurde, incl. Groß- und
    Kleinschreibung

    Auf die schnelle.

    VB.NET-Quellcode

    1. Protected Overrides Function ProcessCmdKey(ByRef msg As Message, ByVal keyData As Keys) As Boolean
    2. Dim tempKeys As Keys = keyData And Not Keys.Shift And Not Keys.ShiftKey
    3. If tempKeys <> Keys.None Then
    4. If CBool(keyData And Keys.Shift) Then
    5. Debug.Print(tempKeys.ToString.ToUpper)
    6. Else
    7. Debug.Print(tempKeys.ToString.ToLower)
    8. End If
    9. End If
    10. Return MyBase.ProcessCmdKey(msg, keyData)
    11. End Function

    Und in keyData steht auch welcher Buchstabe gedrückt wurde.
    Mfg -Franky-

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „-Franky-“ ()

    Ich programmiere und vertreibe seit über 16 Jahren Kassensysteme.

    Das was Du da mit HID vor hast, wird nicht immer funktionieren. Meist sind Kassenrechner langsamer als Dein Entwicklungsrechner. Also ist das "Anwendung in den Vordergrund holen" keine wirkliche Lösung.

    Das was @RodFromGermany geschrieben hat, ist der einzig vernünftige Weg.
    Scanne im Scanner-Handbuch den entsprechenden Strichcode und schon funktioniert Dein Scanner über COM als RS232 Gerät. Treiber sind meist gar nicht notwendig (plug & play).
    Dann einfach die Inputs aus der Schnittstelle abfangen und wenn irgendwas mit "Enter" am Ende kommt, den vorher aufgezeichneten Teil auswerten und verwerfen oder verwenden. Also die "Eingabetaste" leert den internen String und dann wird bei jedem übergebenen Zeichen der String erweitert, bis wieder eine Eingabetaste kommt. Wenns einfacher für Dich ist, dann einfach den erkannten Barcode in eine Textbox schreibenen und Enter casten.

    LG Roland
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at