BarcodeScanner von Tastertur unterscheiden

  • Ich habe ein Problem und bin auch nicht im englishen Forum zu dem Problem fündig geworden.

    Ich habe eine USB Tastertur und ein USB BarcodeScanner

    Im englischen Forum habe ich RawInput gefunden und kann damit den Scanner auch wunderbar auslesen.
    Mein problem liegt dadrin das ich die Tastertur dann nicht mehr verwenden kann da diese ebenfalls geblockt wird und die Daten der Tastertur auch durch die OnInput funktion geschoben wird.

    Ich bräuchte allerdings nur den Barcodescanner durch die Funktion..
    Tastertur soll weiter hin normal Funktionieren.


    Kleines Test Script

    Spoiler anzeigen
    [autoit]


    #include <RawInput.au3>

    [/autoit] [autoit][/autoit] [autoit]

    HotKeySet('{ESC}', '_EXIT')

    [/autoit] [autoit][/autoit] [autoit]

    Global $tRID_KD, $pRID_KD, $iRID_KD
    Global $tRIH, $iRIH
    Global $iNumDevices
    Global $hGUI

    [/autoit] [autoit][/autoit] [autoit]

    $hGUI = GUICreate('Test', 200, 200)
    GUICtrlCreateInput("", 10, 10, 121, 21)

    [/autoit] [autoit][/autoit] [autoit]

    GUIRegisterMsg($WM_INPUT, 'OnInput')

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW)
    $tRID_KD = DllStructCreate($tagRAWINPUTDEVICE)
    $pRID_KD = DllStructGetPtr($tRID_KD)
    $iRID_KD = DllStructGetSize($tRID_KD)
    $tRIH = DllStructCreate($tagRAWINPUTHEADER)
    $iRIH = DllStructGetSize($tRIH)
    $iNumDevices = 1
    DllStructSetData($tRID_KD, 'usUsagePage', 0x01)
    DllStructSetData($tRID_KD, 'usUsage', 0x06) ; 0x01
    DllStructSetData($tRID_KD, 'dwFlags', BitOR($RIDEV_NOLEGACY, $RIDEV_INPUTSINK))
    DllStructSetData($tRID_KD, 'hwndTarget', $hGUI)
    _RegisterRawInputDevices($pRID_KD, $iNumDevices, $iRID_KD)
    While 1
    Sleep(20)
    WEnd
    Func OnInput($hwnd, $iMsg, $iwParam, $ilParam)
    Local $tRI_KD, $pRI_KD, $iRI_KB
    Local $iSize

    [/autoit] [autoit][/autoit] [autoit]

    $tRI_KD = DllStructCreate($tagRAWINPUT_KEYBOARD)
    $pRI_KD = DllStructGetPtr($tRI_KD)
    $iRI_KB = DllStructGetSize($tRI_KD)
    _GetRawInputData($ilParam, $RID_INPUT, $pRI_KD, $iRI_KB, $iRIH)
    If Not @error Then
    if DllStructGetData($tRI_KD, 'Message') = 257 Then
    ;~ ConsoleWrite(DllStructGetData($tRI_KD, 'Message') & @LF)
    ;~ ConsoleWrite(DllStructGetData($tRI_KD, 'hDevice') & @CR)
    ConsoleWrite(DllStructGetData($tRI_KD, 'hDevice') &" -> Num "&DllStructGetData($tRI_KD, 'VKey')&" Key"& Chr(DllStructGetData($tRI_KD, 'VKey')) & @LF)
    EndIf
    EndIf
    $tRI_KD = 0
    Return 'GUI_RUNDEFMSG'
    EndFunc
    Func _EXIT()
    GUIDelete()
    Exit
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit]

    wenn ich

    [autoit]

    DllStructSetData($tRID_KD, 'dwFlags', BitOR($RIDEV_NOLEGACY, $RIDEV_INPUTSINK))

    [/autoit]


    zu

    [autoit]

    DllStructSetData($tRID_KD, 'dwFlags', $RIDEV_INPUTSINK)

    [/autoit]

    mach krieg ich alle angaben kann auch filtern
    aber leider schreibt er mir dann auch vom barcodescanner die daten isn gui.

    vllt hat da jemand eien Idee

  • Kannst du mit GetRegisteredRawInputDevices die vorhandenen Geräte auslesen? Vielleicht findest du ja Parameter, die nur deinen Scanner abfragen.

  • Ja auslesen schon.

    Aber das Problem liegt eigentlich nur noch dadrin das er die Daten wie als Tastertur eingaben an das GUI übermittelt..

    Den Barcode abfangen abfangen klappt alles .
    Was mich halt nur stört ist das er überall rein schreiben will
    Wenn ich ihm verbiete zu schreiben, kann ich auch auslesen und drauf reagieren.
    Aber leider wird die Normale Tastertur mit geblockt.

    habe mich wohl etwas undeutlich ausgedrückt.

  • Ich glaube, du musst anhand des DeviceHandles im lParam unterscheiden, was du mit dem Event machen willst.
    Um das richtige Handle zu finden, sollten diese beiden FUnktionen helfen:
    GetRawInputDeviceList
    GetRawInputDeviceInfo

  • Ist schon schlecht wenn du kein barcodescanner zur hand hast ;)

    [autoit]


    DllStructSetData($tRID_KD, 'usUsagePage', 0x01)
    DllStructSetData($tRID_KD, 'usUsage', 0x06) ; 0x01
    DllStructSetData($tRID_KD, 'dwFlags', BitOR($RIDEV_NOLEGACY, $RIDEV_INPUTSINK))
    DllStructSetData($tRID_KD, 'hwndTarget', $hGUI)

    [/autoit]


    Da wird das Verhalten festgelegt

    In der Funktion ist es schon zu spät.

    ein einfaches in der Funktion unterscheiden ist kein problem .. das geht auch ... nur werden die eingaben wenn ich den block auslasse durchgelassen.

    Bau dir ein gui setze den fokus mal nicht auf ein edit feld und hau mal auf die tastertur.
    So musst du dir das vorstellen.. wenn es dann noch eine Listview ist wie bei mir das der fall ist versucht er dadrin rumzuspringen und ein eintrag zu finden.

    Man kann nun die Devices blockieren das sie keine eingaben zum gui machen dürfen..
    Und genau das Will ich auf nur ein Gerät anwenden .. wie ich das Gerät filter weiß ich alles schon ...
    mir Fehlt halt nur etwas das ich nicht alle tasterturen Blockiere sondern nur eine.


    Zum Thema BarcodeScanner gibt es leider nicht soviel im Netz.

    Dank dir trozdem für deine kostbare zeit :)

    Eine möglichkeit dafür muss es ja geben und ein teuren Scanner will ich mir nicht kaufen der zb über rs232 ansprechbar ist.
    Finde das es als tastertur erkannt wird soweit schon ganz gut so kann man auch mal eben kurz in excel ein barcode reinfeuern.

  • eventuell kannst du ja mit DefRawInputProc das Zeug weiterleiten?
    Edit: Ne, das funktioniert wohl doch nicht. Mir fällt nichts mehr ein.

    Einmal editiert, zuletzt von progandy (9. September 2010 um 20:27)

  • Hallo,

    ich habe den Unterschied zwischen Tastatur und Barcode Scanner viel einfacher gelöst.
    In den meisten Barcode Scannern kann man ein Prefix und und Suffix programmieren.
    Damit erscheint beispielsweise immer vor dem eigentlichen Barcode ein ALT+b und nach dem barcode ein xx + enter. Dann einfach nach diesen gleichen Aufbau überwachen und fertig...

    Franz

    ---
    In "Independence Day" konnten die Windows-Erdcomputer problemlos mit denen der Außerirdischen kommunizieren. Was sagt uns das über unseren lieben Bill Gates? :D
    ---

  • das hab ich ja auch .. ich sag ja den Barcode rausfiltern ist kein Problem.
    Das problem liegt beim versuch die Tastertur eingaben vom barcodescanner zum Gui zu blocken das er dort niergends was einträgt..
    Das auslesen geht ja weiterhin.
    Leider wird halt auch die normale Tastertur geblockt.

  • also meine Barcode Gui wird nur aktiv, wenn das gesuchte pattern erscheint. Ansonsten funktioniert die Tastatur ganz normal.. Könnte sein, dass ich nicht ganz versteh wie Du das ganze nutzen willst.

    ---
    In "Independence Day" konnten die Windows-Erdcomputer problemlos mit denen der Außerirdischen kommunizieren. Was sagt uns das über unseren lieben Bill Gates? :D
    ---

  • Ich hätte folgende Idee:
    -Setze den Hotkey (eventuell per GUISetAccelerators) auf den Scanner-Hotkey.
    -Sobald dieser gedrückt wird, wird die Tastatur blockiert und der Scanner abgefragt
    -->Timeout nach 1-2 Sekunden (falls der User und nicht der Scanner den Hotkey drückt)
    -Bei der Endkombination wird die Tastatur wieder freigegeben

    Statt zu blocken kannst du auch den Fokus auf das Barcodefeld setzen.

  • Ähm nein.

    Okay Folgt habe meine Gui offen ist eine Artikelverwaltung mit Rechnungsdruck ect.
    Das ist für einen Shop.

    Nun soll wenn die NormaleGui offen ist bei Barcodescann gleich die EAN gesucht und markiert werden ( tut es auch alles )
    Wenn nun aber der Fokus im Suchfeld ist, schreibt er ja schon den code rein.
    Ist der Focus auf der listview versucht die Listview wie wenn man normal über tastertur eingibt ein eintrag zu suchen.

    Ist das ganze im Rechnungsmodus wird der Artikel hinzugefügt gegebenenfalls hochgezählt...

    Aber mit aktevieren bzw deaktevieren über Hotkey ist ne idee .. mal schaun wie ich das am dümmsten nun alles umbau.

    Dank euch beiden erstmal

  • So hab mir das nochmal durch den kopf gehen lassen

    Die möglichkeit über hotkey zu steuern bringt mich aber auch nicht weiter.


    Da er troz allem ja trozdem die daten als tastertureingaben sendet

    außer ich fang einfach alle tasten als hotkey ab was aber ein riesen aufwand wäre
    wäre ja ein Keyloger

    Und das ist mit sicherheit nicht der schönste weg ..
    dann leb ich lieber damit das er mir so wie es jetzt ist die daten auch an listview sendet wenn der focus drauf ist.

    oder gibt es eine möglichkeit nur für listview tastertur eingaben zu unterbinden ?
    Dann wäre das ganze übel schon gelöst
    da ich beim ersten zeichen vom Scanner den focus auf die listview laufen lasse

  • okay ich antworte mir selbst nochmal

    Lösung einfach ein verstecktes Input feld erstellen und wenn scan kommt einfach den focus in das inputfeld setzen

  • An welcher Stelle prüfst du, ob etwas vom Barcode Scanner kommt oder nicht?

    Ich will, dass wenn der Barcode Scanner genutzt wird ein Focus auf ein input kommt, sodass jeder Input vom Scanner direkt in ein bestimmtes Input geschrieben wird, und nicht immer dahin wo ich grad bin.

    Grüße Yaerox

    Grüne Hölle

  • Stell den Scanner so ein, dass ein Ident-Code gesendet wird, bevor die Daten kommen.
    Wenn du den Scanner als USB-Tastatur konfigurierst, dann wird auch eine "Tastatur" ausgewertet! D.h. es gibt auch elektrisch bzw. Treibertechnisch KEINEN Unterschied zw. dem Scammer und einer Tastatur!

  • Das Problem ist, dass ich davon nicht ausgehen kann, dass die Scanner alle diese Einstellung haben, die mit dieser Software genutzt werden.

    Ich konnte das Problem lösen da die genutzten Barcode Scanner eine unterscheidliche Anzahl an "Tasten" haben als eine Tastatur. Somit rufe ich Geräteinformationen ab, und alles was von einer einfachen Tastatur abweicht wird als Scanner deklariert. Das ist keine besonders schöne Lösung, aber nach dem Lastenheft ist dies eine ausreichende Prüfung.

    Grüße Yaerox

    Grüne Hölle

  • Somit rufe ich Geräteinformationen ab, und alles was von einer einfachen Tastatur abweicht wird als Scanner deklariert.

    oha, viel Spass damit...Ladekabel, Sticks, Lampen, Kaffeewärmer, Kameras und was es sonst noch alles mit USB-Anschluß gibt, wird als Scanner deklariert :rolleyes:

  • Hallo Scan-Boys. ;)

    Ich hatte damals das gleiche Problem, als wir Handscanner eingeführt haben.
    Die Tastatur ging so lange, bis einmal gescannt wurde, danach war sie blockiert.
    Ich habe mich dann mit dem Vertrieb des Handscanners in Verbindung gesetzt und
    bekam folgende Hilfe:

    Im Handbuch gab es zahlreiche Einstellmöglichkeiten erklärt und die Einstellung
    kann man alle mit dem Scanner durchführen. Einfach immer als erstes auf "Werks-
    einstellung" zurück setzen, dann das was man möchte. Ich habe dann den Hand-
    scanner zurück gesetzt und dann auf "Scanner und Tastatur verwenden" verwendet.
    Waren irgendwie sieben oder acht Scanncodes die ich nacheinander einscannen mußte
    und schon war die Blockarde der Tastatur behoben.

    Mein Vorschlag. Versuche mal, so Du es denn hast, das Handbuch zur Hand zu nehmen und
    zu lesen. Am besten mal im Inhaltsverzeichnis nach sehen unter Problemlösungen. Ach so,
    evtl. gibt es das Handbuch auch online. Unser Anbieter hat es damals online gestellt und ich
    meine das es dort immer noch ist.

    So, dann mal viel Erfolg und "Goog scan". ;)

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl