Barcode in Variable scannen ohne den Inhalt irgendwo anzuzeigen

  • Dies hilft wahrscheinlich auch nicht weiter, aber zumindest für unsere Nim Freunde ist was dabei ^^ :

    Keyboard input/Flush the keyboard buffer - Rosetta Code

    Library: POSIX

    Code
    const TCIFLUSH: cint = 0
    proc tcflush(fd, queue_selector: cint): cint {.header: "termios.h".}
     
    discard tcflush(cint(getFileHandle(stdin)), TCIFLUSH)

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • ich habe nicht alles durchgelesen :I

    aber habe etwas ähnliches gemacht,

    GUI -> Felder die ausgefüllt werden müssen -> Inputfeld wird aktiv -> fürs scannen wird Inputfeld anvisiert -> Nun Scannt der Nutzer erst ... nachdem Inputfeld beschrieben ist mach das nächste feld frei und so weiter.

    Wenn du das auch so ähnlich machen möchtest und den Inhalt dabei nicht sehen möchtest dann mach doch aus dem Inputfeld ein @ES_Password.

    Um damit dann weiter zu arbeiten könntest du den Wert einfach auslesen und in einer Variable speichern, ohne ihn anschauen zu müssen.

    @Edit.. du wolltest ja kein inputbox anzeigen lassen sry ...

  • So, noch etwas konstruktives!

    Ich konnte den Msg-Queue von der Scanner-Eingabe "befreien", somit braucht man kein Dummy-Input mehr:

  • Oscar
    Also ich habe den DeviceName \\?\HID#VID_04B4&PID_0100#7&1dd93500&0&0000#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}, also ein anderer als Du ihn hast.
    Aber ich brauche dqa nichts änderen, das läuft auch ohne das ich den DeviceName abändere.

    Lieben Gruß,
    Alina

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

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Aber ich brauche dqa nichts änderen, das läuft auch ohne das ich den DeviceName abändere.

    Jein!

    Wenn Du da nicht den richtigen Devicenamen einträgst, dann wird der Barcode im Input angezeigt (was ein Zeichen dafür ist, dass die Funktion den Code nicht bearbeitet hat, sieh mal in die Consolenausgabe).

    Der Barcode soll aber oben im Label angezeigt werden. Das Input-Control dient nur dazu, aufzuzeigen, dass gleichzeitig auch noch eine Eingabe von Tastatur möglich ist.

  • Oscar
    Habe mein meinen DeviceName eingebe.

    Beispiel 3x direkt nacheinander mein EDV-Lieblingsbuch eingescannt:
    9783836235075

    9783836235075

    9783836235075

    Sieht super aus. DANKE, kann ich bestimmt auch mal gebrauchen und lager ich mal ein.

    Lieben Gruß,
    Alina

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

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • aber ich bekomme einfach die InputBox da nicht raus, kannst du mir da noch einen Tipp geben ?

    Was ist denn so schwer daran, etwas aus dem Script zu löschen?

  • Hi Oscar ,

    wenn ich alles entferne was mit dem GUI zutun hat, läuft das ganze script nicht mehr. Wenn ich das richtig verstehe reagiert das Script auch erst wenn sich etwas in der GUI verändert ?

    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    Exit

    Gibt es denn eine Möglichkeit das GUI auszublenden ? Ich habe es hiermit versucht (GUISetState(@SW_HIDE)) dann zeigt er zwar kein Eingabefenster mehr an, aber dann fängt er die Daten des Scanners nicht ab. Da wo der Wurster steht, schreibt er die Daten des Scanners rein, aber genau das möchte ich nicht, ich brauche die scannereingabe in einer Variable.

    Für alte Hasen wahrscheinlich eine Kleinigkeit, für Neueinsteiger wie mich aber ne echte Herausforderung, bin also für jede Hilfe dankbar.

  • Gibt es denn eine Möglichkeit das GUI auszublenden ?

    Ganz ohne Gui geht es nicht, weil die Events Windowbasiert sind. Man kann das Fenster aber verstecken und den Buffer an eine globale Variable übergeben:

  • Hi Oscar ,

    danke, das geht in die richtige Richtung :)

    Gibt es noch eine Möglichkeit die scandaten abzufangen, also nur in die Variable zu schreiben und sie nicht an das "System" zu übertragen ?

    In der Console sieht das jetzt so aus:

    100028

    Global: 100028

    100032

    Global: 100032

    100033

    Global: 100033

    Der Wert Global ist klar, der kommt hiervon: ConsoleWrite('Global: ' & $g_sBarcode & @CRLF) ; nur zum debuggen

    Die Scandaten dazwischen kommen aber, soweit ich das sehe direkt vom Scanner und die brauche ich da nicht.

    Ich hoffe das ist irgendwie verständlich :)

  • Sobald ich das Fenster auf @SW_HIDE setzte, überträgt er die Scandaten ans System, mit @SW_SHOW fängt er die Scandaten ab, aber ich habe das Fenster was ich nicht haben möchte.

    Ich habe das Fenster jetzt als Workarround ausserhalb des Bildschirms platziert, das geht, aber da gibt es bestimmt noch eine sauberer Lösung, oder ?

  • aber da gibt es bestimmt noch eine sauberer Lösung, oder ?

    Hmm...das Problem ist, dass da die Tastatureingaben der Gui abgefangen werden.

    Ob und wie man das systemweit machen kann, weiß ich nicht.

    Es ist sogar so, dass die Scandaten an ein anderes Fenster gesendet werden, wenn das gerade aktiv ist. Insofern nützt es wenig, die eigene Gui zu verstecken.

    Was willst Du denn mit den Scandaten machen? Benutzt Du denn gar keine Gui? Es muss ja nicht die Gui aus dem Beispiel sein.

  • Hi, das soll ein Terminal/Monitor werden, der soll nur eine Excel/HTML Seite darstellen, die bei Änderung aktualisiert wird. Auf dem Terminal/Monitor sollen Fertigungsaufträge dargestellt werden. Das alles funktioniert auch soweit schon sehr gut. Jetzt möchte ich an den Terminals/Monitor noch die Möglichkeit haben die Fertigungsaufträge zu scannen und somit diesen den Status "Angefangen" und "Abgeschlossen" mitgeben und genau dafür benötige ich die Scanfunktion.

  • Hmm...das Problem ist, dass da die Tastatureingaben der Gui abgefangen werden.

    Ob und wie man das systemweit machen kann, weiß ich nicht.

    Es ist sogar so, dass die Scandaten an ein anderes Fenster gesendet werden, wenn das gerade aktiv ist. Insofern nützt es wenig, die eigene Gui zu verstecken.

    Sofern Pre- und Postzeichen gesendet werden, die auch definitiv im allgemeinen Datenverkehr niemals an das System gesendet werden, könnte ich mir vorstellen, dass ein systemweiter Keyboard-Hook auch ohne ein Fenster auskommt und somit die Daten einfängt. Ich habe nur keinen Scanner hier zum Testen.

  • dass ein systemweiter Keyboard-Hook auch ohne ein Fenster auskommt und somit die Daten einfängt.

    Ja, wenn ein Prefix gesendet wird, kann man das hier benutzen:

  • Hallo Oscar ,

    besten Dank für deine ganze Unterstützung hier, das Script passt so perfekt zu meinem Vorhaben.

    Ich habe aber leider noch ein Verständnisproblem, wo setzte ich am besten den Teil rein, an dem er den vom Scanner ausgelesenen Wert weg schreibt ?

    Kann ich das in der Funktion KeyProc hinzufügen ?

    Ist auch nichts aufregendes:

    Func StatusSave()

    if fileexists($Freigabe & "\Prod-Status\" & $Gewerk & "\" & $sBuffer & "_Start.log") Then

    Local $hFile = FileOpen($Freigabe & "\Prod-Status\" & $Gewerk & "\" & $sBuffer & "_Ende.log", 1)

    Else

    Local $hFile = FileOpen($Freigabe & "\Prod-Status\" & $Gewerk & "\" & $sBuffer & "_Start.log", 1)

    EndIf

    _FileWriteLog($hFile, $sBuffer& @CRLF)

    FileClose($hFile)

    EndFunc

    Ich würde es ja auch dort platzieren, wo die Funktion KeyProc gestartet wird, jedoch finde ich die Stelle nicht.

  • Kann ich das in der Funktion KeyProc hinzufügen ?

    Ja, mit Übergabeparameter geht's ohne Zuweisung an eine globale Variable:

  • Hallo Oscar ,

    danke für den Tipp, das funktioniert.

    Jetzt habe ich aber noch das Problem, dass er die scanns eine Zeit lang funktionieren, dabei schreibt er sowohl das Log weg, wie auch in der Console sieht man die Aktivitäten. Nach einer gewissen Zeit jedoch, einige scanvorgänge später schreibt er weder die Log noch zeigt er in der Console etwas an. Es scheint, alsob der Hook nicht mehr auf den Scanner reagiert. Vielleicht noch eine Idee was das sein könnte ?