PIN-Eingabefenster

  • Hallo zusammen,

    mein Script ist dazu gemacht, dass man es per #include in ein anderes Script einbinden kann.
    Es erzeugt ein PINPad, auf dem man einen PIN mit der Maus eingeben kann, welcher per Variable übergeben wird. Optional kann noch ein Zeitlimit hinzugefügt und der PIN verschlüsselt werden. Per @error lassen sich Fehler feststellen und per @extended der Grund, warum die GUI geschlossen wurde.
    Die Tasten werden wie auf einem richtigen PIN-Pad dargestellt. Die Icons dafür stammen aus einer dll, welcher ich binär eingebunden habe (siehe unten, wie das funktioniert).

    Nachdem die finale Version fertiggestellt wurde, werde ich sie ab sofort hier vorne, zwecks Übersichtlichkeit, einfügen.

    |------------------------------------|
    |Aktuelle Version ist 3.01 |
    |------------------------------------|

    Sie kann hier mit Beispielen heruntergeladen werden:

    ||========||
    ||autoit.de/wcf/attachment/8705/||
    ||========||

    Ich möchte mich nochmal bei den vielen Shoutboxhelfern bedanken! :) :)
    Insbesondere BugFix gilt mein Dank, der ein Script entwickelt hat, welches eine Datei binär einbindet, ohne dass sie während der Komplimierung real existieren muss. :) :)
    Hier der Link: Fremddateien "includen" (ohne FileInstall)

    Natürlich freue ich mich über Kritik und Anregungen. Gerne sind auch Rechtschreibkorrekturen gesehen (mein Englisch ist nicht umbedingt perfekt). Habe jetzt nochmal eine 3.01 Version mit Rechtschreibkorrekturen gemacht. Wie gesagt: Anregungen sind weiterhin gerne gesehen :) :)
    Fragen könnt ihr hier natürlich auch stellen.

    Ich wünsche euch dann noch viel Erfolg und Spaß!

    LG FKFK


    ------------------------------------alter Beitrag--------------------------------------alter Beitrag---------------------------------------alter Beitrag--------------------------------------------


    Hallo zusammen,

    habe jetzt mal ein Sript gebastelt, mit dem man eine PIN-Fläche erzeugt. Der eingegebene PIN wird ausgelesen und kann weiterverwendet werden. Es ist so konzipiert, dass es per #include eingebunden werden kann...
    Würde mich mal interessieren, wie ihr das findet und ob es noch Verbesserungsmöglichkeiten gibt?
    Wenn es fertig ist, würde ich es gerne zur Verfügung stellen :)

    [autoit]

    #cs ----------------------------------------------------------------------------

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

    AutoIt Version: 3.3.2.0
    Author: Florian Kurrle

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

    Script Function:
    Eine PIN-Eingabefläche wird erzeugt und der eingegebene PIN wird weitergegeben.

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

    Empfohlen: AutoItSetOption("MustDeclareVars", 1) (Zwingt alle Variablen zu deklarieren)
    Benötigt: Opt("GUICoordMode", 0) (spätere Rückändernung nach Schließen des Fensters möglich)
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <PIN_Fenster.au3> (Dies ist die Datei mit der PIN-Eingabefläche) Sofern die Datei sich nicht im Standart-Include-Verzeichnis befindet muss #include "path\PIN_Fenster.au3" (path ist der Verzeichnispfad der Datei)

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

    Nutzung: _PIN_Fenster() eingeben, zur Erstellung des Fensters
    $_PIN ist der eingegeben PIN.
    Bei Betätigung der E-Schaltfläche wird der eingegebene PIN gelöscht.

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

    #ce ----------------------------------------------------------------------------

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

    ;Deklarierung der PIN-Variable
    Global $_PIN

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

    ;--Erstellung des Fenster zur Ermittlung des PINs

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

    Func _PIN_Fenster()
    Local $btn, $msg, $btn1, $btn2, $btn3, $btn4, $btn5, $btn6, $btn7, $btn8, $btn9, $btn0, $E
    $_PIN = "" ;PIN wird zur Fehlervermeidung gelöscht
    GUICreate("", 109.5, 148)
    ;Button1
    $btn1 = GUICtrlCreateButton("1", -1, -1, 37, 37)
    ;Button2
    $btn2 = GUICtrlCreateButton("2", 37, -1, 37, 37)
    ;Button3
    $btn3 = GUICtrlCreateButton("3", 37, -1, 37, 37)
    ;Button4
    $btn4 = GUICtrlCreateButton("4", -74, 37, 37, 37)
    ;Button5
    $btn5 = GUICtrlCreateButton("5", 37, -1, 37, 37)
    ;Button6
    $btn6 = GUICtrlCreateButton("6", 37, -1, 37, 37)
    ;Button7
    $btn7 = GUICtrlCreateButton("7", -74, 37, 37, 37)
    ;Button8
    $btn8 = GUICtrlCreateButton("8", 37, -1, 37, 37)
    ;Button9
    $btn9 = GUICtrlCreateButton("9", 37, -1, 37, 37)
    ;Button0
    $E = GUICtrlCreateButton("E", -74, 37, 37, 37)
    ;E-Button
    $btn0 = GUICtrlCreateButton("0", 37, -1, 37, 37)
    ;;OK-Button
    ;$btn6 = GUICtrlCreateButton("Ok", -1, -1, 37, 37)
    ;OK-Button
    $btn = GUICtrlCreateButton("Ok", 37, -1, 37, 37)
    GUISetState()
    ;Überprüft, ob der OK-Button gedrückt, das Fenster geschlossen wurde und erstellt den PIN
    $msg = 0
    While 1
    $msg = GUIGetMsg()
    If $msg == $GUI_EVENT_CLOSE Then Exit ;Bei Drücken auf die Schließentaste wird das Sript beendet
    Select
    Case $msg = $btn
    ExitLoop
    Case $msg = $btn1
    $_PIN &= 1
    Case $msg = $btn2
    $_PIN &= 2
    Case $msg = $btn3
    $_PIN &= 3
    Case $msg = $btn4
    $_PIN &= 4
    Case $msg = $btn5
    $_PIN &= 5
    Case $msg = $btn6
    $_PIN &= 6
    Case $msg = $btn7
    $_PIN &= 7
    Case $msg = $btn8
    $_PIN &= 8
    Case $msg = $btn9
    $_PIN &= 9
    Case $msg = $btn0
    $_PIN &= 0
    Case $msg =$E
    $_PIN = ""
    EndSelect
    WEnd
    GUIDelete()
    EndFunc

    [/autoit]

    Wie gesagt: Es ist darauf ausgelegt, irgendwo eingebunden zu werden und nicht, um als selbstständiges Script zu existieren...

    LG FKFK

  • Super Idee :thumbup: .
    Es werden allerdings nur 3 Button angezeigt, das liegt vermutlich daran, dass Du negative Zahlen für die Positionierung der Buttons genutzt hast.

  • Super Idee :thumbup: .
    Es werden allerdings nur 3 Button angezeigt, das liegt vermutlich daran, dass Du negative Zahlen für die Positionierung der Buttons genutzt hast.


    Du brauchst Opt('GUICoordMode', 0) ;)

  • Super Idee :thumbup: .
    Es werden allerdings nur 3 Button angezeigt, das liegt vermutlich daran, dass Du negative Zahlen für die Positionierung der Buttons genutzt hast.

    Siehe Beschreibung:
    Benötigt: Opt("GUICoordMode", 0)

    Dann wirds bestimmt klappen :)

    Habe vor, das für so eine Art Sperre zu verwenden: Wenn man den richtigen PIN nicht eingibt, dann wird Tastatur und Maus nicht freigegeben :)

    //edit: Ah, sehe gerade, dass das schon jemand geklärt hat...

  • Schau dir mal die Koordinaten an. :D
    Wenn man schon C&P macht, dann
    sollte mal auch die Werte ändern. xD

    Was vielleicht auch schön wäre, wenn
    du dir bei Google ein Originalbild von der
    PIN-Tastatur ziehst, das klein schneidest
    und die Bilder halt als Tasten verwenden
    würdest. :P

    Du könntest auch ein "Eingabelimit"
    einbauen und die Position des GUI's
    abfragen in der Funktion, damit diese
    nicht deine fest voreingestellte Position
    benutzen muss. ;)


    MfG
    qixx

  • Zu 1: Naja, bei mir klappt es trotzdem :D bei dir bestimmt auch, wenn du es ausprobierst :)
    Zu 2: Das mit den Bildern ist eine gute Idee! Werde ich dann mal noch machen...
    Zu 3: Über das Eingabelimit habe ich schon nachgedacht. Am besten werde ich das benutzerdefiniert integrieren... Was meintst du mit Position des GUIs abfragen?
    Meinst du damit, falls man das Script in ein andres GUI einbinden möchte?

  • Du solltest den GUICoord-Mode in deiner Funktion setzen, sonst kommen noch mehr solche Beiträge ;)

    [autoit]

    ; Am Anfang
    Local $OldCoord = Opt("GUICoordMode", 0)
    ...
    ; am Ende:
    Opt("GUICoordMode", $OldCoord)

    [/autoit]
  • Du solltest den GUICoord-Mode in deiner Funktion setzen, sonst kommen noch mehr solche Beiträge ;)

    Ja, das stimmt!
    Nur suche ich noch nach einer Möglichkeit, wie man das einbauen kann, ohne dass ein bisheriger GUICoord-Mode überschrieben wird, der evtl. bereits gesetzt wurde.

  • Ist doch in dem Pseudocode von mir drin ;) Opt() gibt den alten Wert zurück, einfach zurücksetzen, wenn du es nicht mehr brauchst.

  • Ist doch in dem Pseudocode von mir drin ;) Opt() gibt den alten Wert zurück, einfach zurücksetzen, wenn du es nicht mehr brauchst.

    Hmmmm, ich habe zwar irgendwie nicht verstanden, warum dein Code funktionieren sollte, aber er hat trotzdem geklappt :thumbup:
    Kann das sein, dass sich nach Beenden der Funktion der Wert zurücksetzt bzw. wenn man den gleichen Wert nochmals eingibt, dass er dann auf Standart zurückgestellt wird? Sorry, hab irgendwie nicht kapiert, wie es geklappt hat, sondern nur dass :)

  • Hmmmm, ich habe zwar irgendwie nicht verstanden, warum dein Code funktionieren sollte, aber er hat trotzdem geklappt :thumbup:
    Kann das sein, dass sich nach Beenden der Funktion der Wert zurücksetzt bzw. wenn man den gleichen Wert nochmals eingibt, dass er dann auf Standart zurückgestellt wird? Sorry, hab irgendwie nicht kapiert, wie es geklappt hat, sondern nur dass :)

    [autoit]

    ; Am Anfang
    Local $OldCoord = Opt("GUICoordMode", 0) ; speichert den alten Wert in $OldCoord und setzt den Modus auf 0
    ...
    ; am Ende:
    Opt("GUICoordMode", $OldCoord) ; setzt den Modus auf den gespeicherten Wert.

    [/autoit]
  • Was meintst du mit Position des GUIs abfragen?
    Meinst du damit, falls man das Script in ein andres GUI einbinden möchte?

    Ich meine, dass du eine feste Position des
    GUI's angegeben hast. Das solltest du vielleicht
    mit Variablen machen, die mit dem Aufrufen
    der Funktion benutzt werden, wenn du verstehst,
    was ich meine. :P Ist nichts Großartiges. xD Wenn
    du es nicht verstehst, ist nicht so schlimm. :P


    MfG
    qixx

  • Hallo zusammen,

    habe jetzt das Sript nochmal verbessert, Variablen für die Postion eingefügt, wie du gesagt hast qixx und noch Icons hinzugefügt :)
    2 Examples sind schon dabei und auch alles auf Englisch geschrieben :D
    Wenn ihr Fehler in den englischen Formulierungen findet, dann bitte melden!

    qixx: Ich glaube, ein Eingabelimit lohnt sich nicht. Wie sollte das auch gehen und was sollte das nützen? Man kann höchsten die Variable begrenzen, aber nicht verbieten, dass jemand 100mal auf den gleichen Button klickt ;)

    Habe den Quellcode nochmal reinkopiert und anbei nochmal alles zusammen (mit Icons, Examples usw.) gehängt...
    Ich hatte mir mal überlegt, ob ich die Icons in eine DLL einbinde, aber nachdem die Icons mit einer sehr schlechten Qualität eingebunden wurden, habe ich das doch gelassen. Weiß jemand, wie man trotzdem eine gute Qualität erreicht?

    LG FKFK

    Spoiler anzeigen
    [autoit]

    #cs ----------------------------------------------------------------------------

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

    AutoIt Version: 3.3.2.0
    Author: Florian Kurrle
    Sript Version: 2.0

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

    Script Function:
    Creates a Window, where you can enter a PIN with your mouse and which can output the PIN as variable

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

    Syntax: _PIN_Win([left[, top]])
    Return values:Success 1
    Failure 0 and set @error to 1. This can happend only when passing wrong parameters.

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

    Usage: #include <PIN_Fenster.au3> (when it's in the stadart include-path)
    #include "path\PIN_Fenster.au3" (when it isn't in the standart include-path)
    $_PIN is the entered PIN
    When you press the E-button, you delete the entered PIN
    When you press the C-butto, you confirm the entered PIN

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

    #ce ----------------------------------------------------------------------------
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    #include-once

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

    ;Declare the PIN
    Global $_PIN

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

    #Region GUI/Func
    Func _PIN_Win($length = "", $left = -1, $top = -1)
    If Not IsNumber($length) Or $length < 1 Then Return SetError(1, 0, 0)
    If $left < -1 Or $top < -1 Then Return SetError(1, 0, 0)
    Local $btn, $msg, $btn1, $btn2, $btn3, $btn4, $btn5, $btn6, $btn7, $btn8, $btn9, $btn0, $E, $OldCoord
    $OldCoord = Opt("GUICoordMode", 0)
    $_PIN = "" ;PIN is deleting
    GUICreate("", 109.5, 148, $left, $top)
    ;Button1
    $btn1 = GUICtrlCreateButton("", -1, -1, 37, 37, 0x0040)
    GUICtrlSetImage(-1, "../Images/_1.ico")
    ;Button2
    $btn2 = GUICtrlCreateButton("", 37, -1, 37, 37, 0x0040)
    GUICtrlSetImage(-1, "../Images/_2.ico")
    ;Button3
    $btn3 = GUICtrlCreateButton("", 37, -1, 37, 37, 0x0040)
    GUICtrlSetImage(-1, "../Images/_3.ico")
    ;Button4
    $btn4 = GUICtrlCreateButton("", -74, 37, 37, 37, 0x0040)
    GUICtrlSetImage(-1, "../Images/_4.ico")
    ;Button5
    $btn5 = GUICtrlCreateButton("", 37, -1, 37, 37, 0x0040)
    GUICtrlSetImage(-1, "../Images/_5.ico")
    ;Button6
    $btn6 = GUICtrlCreateButton("", 37, -1, 37, 37, 0x0040)
    GUICtrlSetImage(-1, "../Images/_6.ico")
    ;Button7
    $btn7 = GUICtrlCreateButton("", -74, 37, 37, 37, 0x0040)
    GUICtrlSetImage(-1, "../Images/_7.ico")
    ;Button8
    $btn8 = GUICtrlCreateButton("", 37, -1, 37, 37, 0x0040)
    GUICtrlSetImage(-1, "../Images/_8.ico")
    ;Button9
    $btn9 = GUICtrlCreateButton("", 37, -1, 37, 37, 0x0040)
    GUICtrlSetImage(-1, "../Images/_9.ico")
    ;Button0
    $E = GUICtrlCreateButton("", -74, 37, 37, 37, 0x0040)
    GUICtrlSetImage(-1, "../Images/_E.ico")
    ;E-Button
    $btn0 = GUICtrlCreateButton("", 37, -1, 37, 37, 0x0040)
    GUICtrlSetImage(-1, "../Images/_0.ico")
    ;C-Button (OK-Button)
    $btn = GUICtrlCreateButton("", 37, -1, 37, 37, 0x0040)
    GUICtrlSetImage(-1, "../Images/_C.ico")
    GUISetState()
    ;Check which buttons are pressed and react proportionally
    $msg = 0
    While 1
    $msg = GUIGetMsg()
    If $msg == $GUI_EVENT_CLOSE Then Exit
    Select
    Case $msg = $btn
    ExitLoop
    Case $msg = $btn1
    $_PIN &= 1
    Case $msg = $btn2
    $_PIN &= 2
    Case $msg = $btn3
    $_PIN &= 3
    Case $msg = $btn4
    $_PIN &= 4
    Case $msg = $btn5
    $_PIN &= 5
    Case $msg = $btn6
    $_PIN &= 6
    Case $msg = $btn7
    $_PIN &= 7
    Case $msg = $btn8
    $_PIN &= 8
    Case $msg = $btn9
    $_PIN &= 9
    Case $msg = $btn0
    $_PIN &= 0
    Case $msg = $E
    $_PIN = ""
    EndSelect
    WEnd
    GUIDelete()
    Opt("GUICoordMode", $OldCoord)
    EndFunc
    #EndRegion GUI/Func

    [/autoit]


    Hier der Download: autoit.de/wcf/attachment/7574/

  • qixx: Ich glaube, ein Eingabelimit lohnt sich nicht. Wie sollte das auch gehen und was sollte das nützen?

    Eine mit jedem Tastendruck um 1 größer werdende
    Variable. Wenn die Variable einen bestimmten
    Wert hat, die Tastendrücke blocken. :D Was das
    bringen soll? Keine Ahnung! xD


    MfG
    qixx

  • Eine mit jedem Tastendruck um 1 größer werdende
    Variable. Wenn die Variable einen bestimmten
    Wert hat, die Tastendrücke blocken. :D Was das
    bringen soll? Keine Ahnung! xD


    MfG
    qixx

    :D :D :D
    Hast du das Sript schonmal getestet?
    Da kann man nichts mit der Tastatur machen, sondern nur mit der Maus. Da gibts nichts zum Blocken, sondern man kann höchstens sagen, dass sich das Fenster irgendwann schließt, wenn die Variable zu groß ist...
    Dies wäre aber nicht gut, da dadurch die Sicherheit nicht mehr ganz so hoch ist: Man weiß dann nämlich schon, wie lang der PIN ist.

    Aber mir fällt noch etwas ein: Man kann dem Fenster eine variable Zeitvorgabe geben. Dies wäre sicherlich die bessere Alternative :)

  • Joa, gehen würde das schon. Dann deaktviert man einfach die Buttons...
    Man kann ja auch noch einfügen, evtl. über eine zweite Funktion oder so, dass man das eine bestimmte Häufigkeit falsch eingeben kann und dann etwas passiert, wobei das evtl. lieber dem jeweiligen Benutzer überlassen sein sollte.

    Zu der Zeit: Ich bin gerade dabei das einzurichten. Das kann ich ja _Timer_SetTimer setzen. Um $hWnd herauszufinden benutze ich $hGUI = GUICreate(...) und als Funktion nehme ich noch eine zweite Funktion, die eine Variable auf eins setzt. In der ersten Funktion wird überprüft, ob die Variable auf eins ist und wenn ja, dann die Funktion per Return beendet. Irgendetwas mache ich falsch, weil es bei mir nicht klappt...

  • So, jetzt habe ich die nächste Version (2.2) fertig :)
    Enthalten sind eine Timerfunktion, nach der sich das Fenster schließen kann, sowie die Positionierung des Fensters per übergebener Variable und eine dll mit Icons, die sich selbst installiert, so dass trotz Icons nichts benötigt wird, außer das Script einzubinden (vielen Dank nochmal für die Funktion von BugFix, die dies ermöglicht: Link)

    Als nächstes Werde ich mich dann an die Verschlüsselungstechnik wagen :)
    Sollte dazu noch jemand Ideen haben, wie man das realisieren kann, dann wäre ich dafür dankbar!

    Hier das Script mit Beispielen: autoit.de/wcf/attachment/8315/

  • Sorry für den Mehrfach-Post, habe jetzt aber schonwieder eine neue Version (2.3) draußen :)
    Eine Verschlüsselungsfunktion ist integriert worden und die Variablen, die ans Hauptscript übergeben werden, sind nicht mehr global sondern local, wegen eventuellen Kompatiblitätsproblemen.
    Da mein Script zu groß ist (wegen der eingebundenen DLL), kann ich es leider nicht posten :(

    Wie üblich mit Beispielen: autoit.de/wcf/attachment/8334/
    Sollten dazu noch Fragen vorhanden sein, dann nur zu :)

    Wahrscheinlich ist das Script bald komplett abgeschlossen. Vielen vielen Dank für die vielen netten Shoutbox-Helfer, die ich immerwieder mit meinen Fragen gelöchert habe bzw. wenn ein Problem aufgetaucht ist :thumbup:

    Spontan fällt mir nur noch eine Kleinigkeit ein, die ich bei dem Script ergänzen könnte: Ich meine schonmal solche Übergabemakros oder was das waren gesehen zu haben, die z.B. anzeigen können, dass sich das Fenster wegen Zeitüberschreitung geschlossen hat oder andere Exit-Gründe. Diese Gründe könnten dann ans Hauptscript übergeben werden, welches sie dann weiterverarbeiten kann und z.B. bei Zeitüberschreitung eine entsprechende Meldung ausgibt oder Funktion startet...
    Oder lässt sich das ganze mit SetError realisieren? Eigentlich ist es ja kein Error, wenn die Zeit überschritten wird...

    Sobald das integriert ist, wäre das Script wahrscheinlich erstmal so ziemlich abgeschlossen. Wenn trotzdem noch jemandem Ideen kommen bzw. mir jemand bei obrigem Problem weiterhelfen kann, dann würde mich das sehr freuen :D

  • Juhu, nach ein bisschen Entwicklungszeit und einigen Fehlerbehbungen kann ich nun meine 3.0-Version und damit voraussichtlich die letzte präsentieren...
    Sollten es noch einige Rechtschreibkorrekturen geben, die mir auch gerne gesagt werden können, mache ich eine 3.1 draus.

    Ansonsten bei Fragen einfach schreiben und sollte jemand troztdem noch Anregungen finden, würde ich das Script natürlich noch verbessern, aber momentan fällt mir nichts Weiteres ein :) :)

    Vielen Dank an die vielen Shoutbox-Helfer!

    Wie üblich mit Beispielen und ausführlicher Beschreibung (auf Englisch):
    autoit.de/wcf/attachment/8677/