Modalfenster (Lightbox) / runde Ecken / Schlagschatten

  • Guten Morgen,

    ich hatte das letzte mal mit Autoit so vor gefühlt 2 Jahren zu tun, d.h. ich muss mich da erst mal wieder reinarbeiten. Aktuell möchte ich nur ein kleines Windows Anmeldescript erstellen (Laufwerke mappen / Outlook Profile tauschen). Das werde ich vermutlich noch hinbekommen. Was ich aber gerne hätte ist so eine Art Modalfenster wie man es von Browsern kennt, d.h. im Vordergrund die eigentliche "kleine" GUI, welche der Benutzer bedienen soll und im Hintergrund über den gesamten Bildschirm so eine abgedunkelte transparente GUI (ich tippe mal auch irgendwas mit Child ....).

    Hat hier vielleicht jemand ein Grundgerüst, auf dem ich aufbauen kann.

    Meine 2. Frage betrifft die Optik der GUI selbst. Irgendwie finde ich die Standard GUI von Autoit leicht old school. Gibt es da eine einfache Möglichkeit, vielleicht wenigsten die Ecken abgerundet darzustellen, oder eine Art Schlagschatten zu generieren?

    Vielen Dank

    C4F

  • Such mal im engl Forum nach "GUI round corners". Dann findest DU sowas: https://www.autoitscript.com/forum/topic/17…comment-1272753

  • Da ich noch gar nie was mit Childfenstern gemacht habe, bitte ich hier mal um Hilfe.

    Code
    #Region ; GUI Erstellung
        $hGUI = GUICreate("     Login Tool - Version: " & $sFileVersion, 350, 200, Default, Default, 0x00000080, $WS_EX_TRANSPARENT) ; Das Hauptfenster wird erstellt
        $hGUIChild = GUICreate("", @DesktopWidth - 1, @DesktopHeight - 1, Default, Default, $WS_CHILD, $WS_EX_TRANSPARENT, $hGUI) ; Das dahinter liegende Childfenster wird transparent erstellt
        GUICtrlSetBkColor($hGUIChild, $COLOR_BLACK) ; Die Hintergrundfarbe vom Childfenster soll Schwarz eingefärbt werden
        WinSetOnTop($hGUI, Default, 1) ; Das Hauptfenster in den Vordergrund stellen
        GUISetState(@SW_SHOW, $hGUIChild) ; Das Childfenster neu aufbauen
        GUISetState(@SW_SHOW, $hGUI) ; Das Hauptfenster neu aufbauen
    #EndRegion ; GUI Erstellung

    Irgendwie passiert hier mit dem Child gar nichts. Ich möchte gerne dass das Child hinter dem Hauptfenster liegt, fast den ganzen Bildschirm bedeckt und dabei scharz und leicht transparent ist, damit man die darunter liegenden Fenster / Icons noch leicht sehen - aber nicht bedienen kann.

    Gruß C4F

  • Kann es sein, das ich hier einen Gedankenfehler habe. Ich denke das ich im Main alles abbilden möchte und das Child als Hintergrundabschirmung verwenden will. Kann es sein, das ich aber das Main als Hintergrundabschirmung nehmen muss und das Child mit den ganzen Checkboxen usw. befüllen muss?

    Um etwas Hilfe wäre ich wirklich dankbar.

  • Ja, das hast du richtig erkannt. In Windows ist ein Child-Window über dem Parent und kann auch dafür genutzt werden, das Parent unbenutzbar zu machen, sodass das Child erst geklickt werden muss, bevor das Parent wieder funktioniert (z.B. für error-meldungen,...).

    Ich vermute mal, dass das Child das WinSetOnTop vom Parent erbt und weiterhin über dem Parent bleibt, hab das aber noch nie probiert^^.

    Evtl. interessant: Controls sind oft auch Child-Windows, die in dem Parent platziert sind.

  • Erst mal vielen Dank.

    Ich habe jetzt mal die ersten Zeilen geschrieben. "Eigentlich" läuft das in die Richtung die mir ausreicht, aber folgendes ist mir aufgefallen, wo ich keine richtige Erklärung dazu habe

    1. Das Passwort wird als OK (also gleich) erkannt, auch wenn die Buchstaben gross oder klein geschrieben werden. Wie kann ich das ändern? Ein a = A ist ja nicht A = A
    2. Wenn ich die ComboBox nicht via Maus bediene, sondern mit den Pfeiltasten den Benutzer raussuche und dann mit der Tabulator Taste zum Passwortfeld hüpfe, wird das Passwort nur vom BenutzerA ausgewertet. Wähle ich BenutzerB oder Mitarbeiter via Pfeiltasten, wird das Passwort als leerer String erkannt. Klicke ich jedoch die ComboBox mit der Maus an, dann wir das Passwort ausgelesen. Ich glaube aber auch, das hier noch im Ablauf der Wurm drin steckt. Vielleicht kann mir hier einer eine Verbesserung vorschlagen
    3. In Zeile 122 lasse ich zur Kontrolle das Passwort an der Console ausgeben. Hierbei fällt mir auf, dass das nicht nur 1x ausgegeben wird, sondern gleich 5 mal. Was mache ich denn da falsch.

    Danke für eure Hilfe

    Loginscript
  • Ich hab das ganze Script mal überarbeitet und einiges ausgebessert.

    Also:

    1. Erstelle Controls wenn möglich direkt mit dem Fenster und ändere nur den Inhalt/State später. (Neben $GUI_DISABLE gibt es auch $GUI_HIDE). Dabei hab ich auch gleich die Größe dynamischer gestaltet => Einfach die Variablen über der Gui ändern und alle Controls ändern die Größe entsprechend. Wenn es mehr Controls werden ist das Gold wert.

    Normalerweise braucht es bei einem Login auch keiner Anleitung, was als nächstes zu tun ist... deshalb hab ich die mal rausgenommen. Die Information welcher User ausgewählt wurde muss auch nicht extra als Label dazukommen... Der User hat es ausgewählt und SIEHT was er ausgewählt hat. Es ist halt nur fürs debugging für dich interessant und sollte deshalb temporär mit dem ConsoleWrite/MsgBox ausgegeben werden. (Außer du hast es mit Menschen zu tun, die noch nie einen Computer gesehen haben... dann könnte es sinn machen).

    2. Die Nutzer in einem Array speichern. Dadurch kannst du mit 1ner Zeile später Nutzer hinzufügen,... ohne die ganzen Funktionen,... zu erstellen. Zumal der Code immer gleich war. Merke: Wenn du mehrmals fast exakt den gleichen Code hast, dann solltest du ein Array/eine Funktion dafür benutzen.

    3. Es wäre extrem unsicher, die Passwörter der Nutzer direkt in der Anwedung zu speichern. Wenn das unbedingt notwendig ist, speicher zumindest nur hashes. Also: Wenn ein neuer Nutzer dazukommt einfach in der Region: Generate passwordhash... die Zeilen auskommentieren und die passwörter eintragen, hashes generieren lassen und diese mit dem salt in das array $arUsers speichern. Danach UNBEDINGT die passwörter wieder aus der Region entfernen. (Alternativ einfach die passwörter als commandlineargument beim start übergeben, keine Ahnung, wie gut du dich mit so etwas auskennst.)

    Hintergrund: Man kann die .exe am ende mit einem Texteditor öffnen und die Passwörter rauslesen. Mit hashes wird es sehr viel schwieriger (und extremst rechenintensiv) => fast unmöglich für normale nutzer und auch für experten zumindest sehr schwer. Falls dich das Thema interessiert such einfach mal nach "Passwörter sicher speichern" und hashes, dann wirst du schnell fündig.

    Edit: Fix mistake Line 136 using #sPasswort instead of the control $idInputPassword

  • Hallo Kanashius,

    danke für die positive Rückmeldung. Den Code schaue ich mir noch in Ruhe an. Ein Hash sagt mir was, aber von einem Salt habe ich noch nie was gehört. Was steckt da genau dahinter?

    Gruß C4F