1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. SOLVE-SMART

Beiträge von SOLVE-SMART

  • Wie informiert Ihr Eure User in einer Domain am PC-Arbeitsplatz über umgehend wichtige und zu beachtende Dinge?

    • SOLVE-SMART
    • 9. März 2023 um 11:19
    Zitat von Moombas

    Danke fürs Lob.

    Sehr gerne 😊 .

    Zitat von Moombas

    Ich bin eher ein Praktiker. Sprich: Erst mal mit einem Entwurf starten und diesen dann step-by-step ausarbeiten/ändern bis das finale Konstrukt steht.

    Iterativ find' ich gut 👍 .

    Zitat von water

    Überzeichnet und grob gesprochen: Bitte programmiert sofort auf Teufel komm raus. Aber nur, wenn ihr damit leben könnt, dass wir euren Code irgendwann rausschmeissen oder erst gar nicht annehmen.

    Accepted 😅 .

    Zitat von water

    Es gibt verschiedene Einschätzungen hinsichtlich der Größenordnung der einzelnen Projektphasen. Hier mal ein Beispiel:

    http://greiterweb.de/spw/Software-Entwicklungsaufwand.htm
    (wobei ich den Inhalt zur besseren Verständlichkeit umsortiert habe.
    Damit wird klar, dass die zweite Auflistung auf Basis der ersten berechnet und die beiden dann zusammengezählt werden müssen.
    Somit macht die Codierung nur gut 15% des gesamten Entwicklungsaufwandes aus)

    Das ist natürlich nur eine Herangehensweise/ein Vorgehensmodell von mehreren. Empfinde es als gut, auf Grund der Anforderungen so damit umzugehen.
    Hoffe das bazii die Zeit dazu findet, alles entsprechend abzuklären (zu kommunizieren) usw.


    Bin gespannt was das hier wird (also positiv und freudig gespannt 👍).
    Ohne water unter Druck zu setzen: Diesmal müssen es mehr als nur 2 Cents werden 🤭 .

    Viele Grüße
    Sven

  • Wie informiert Ihr Eure User in einer Domain am PC-Arbeitsplatz über umgehend wichtige und zu beachtende Dinge?

    • SOLVE-SMART
    • 9. März 2023 um 09:38

    Etwas früh meiner Meinung nach Moombas, da sich ggf. noch einige Dinge ändern könnten, aber sehr schön lesbar und verständlich geschrieben, Danke 😀 .

    Viele Grüße
    Sven

  • _regex_split - StringSplit aber mit regulärem Ausdruck als Trenner

    • SOLVE-SMART
    • 8. März 2023 um 22:49
    Zitat von AspirinJunkie

    Ja viel mehr als ein kleines Snippet ist es ja nicht.
    Fand es dennoch für evtl. nützlich für einige und hatte keinen anderen Ort um es zu veröffentlichen.

    Ist doch genau der richtige Ort dafür AspirinJunkie, denke ich 😀 .

    Zitat von Moombas

    [...] Es wäre natürlich noch schöner das in einer zu kombinieren [...]

    Ich verstehe deine Überlegung Moombas, würde dennoch das Kombinieren ehrlich gesagt als unsauber empfinden.
    Es sind zwei verschiedene Aufgaben, die StringSplit() und _regex_split() haben, daher würde ich dies nicht zusammen fassen.

    Was jeder Einzelne von uns tut, sei jedem selbst überlassen 😇 . Kannst dir ja die Funktion soweit erweitern, falls du dies nicht sowieso schon gemacht hast.

    Danke nochmal fürs Teilen AspirinJunkie.

    Viele Grüße
    Sven

  • Wie informiert Ihr Eure User in einer Domain am PC-Arbeitsplatz über umgehend wichtige und zu beachtende Dinge?

    • SOLVE-SMART
    • 8. März 2023 um 22:36

    Hi zusammen 👋 ,

    ich halte mich kurz: Ich finde es super wie hier zusammen an diesem Thema gearbeitet wird => großes Lob an alle 😊 . Macht Spaß zu verfolgen.

    Eine Bitte hätte ich zu diesem Punkt:

    Zitat von water

    Das Design wird langsam etwas komplex. Wenn Du nach der Abstimmung mit Deinen Admins das OK gibst, dann machen wir daher eine Konversation auf und dokumentieren das Projekt sauber.

    Darf ich bei der Konversation, welche aufgemacht wird, mit dabei sein? Würde gern die Umsetzung und die Dokumentation sehen (ggf. begleiten/helfen/ausbauen).
    Nur bei Bedarf - erstmal stiller Mitleser, da sehr spannend 😅 .

    bazii Ich denke die Meisten hier drücken dir die Daumen 🤞 , dass du deine Freigaben entsprechend erhälst, damit es an das Handwerkszeug (die Implementierung) gehen kann 😀 .
    Übrigens Danke für das Lob in deinem Off-Topic Kommentar 😅 .

    Viele Grüße

    Sven

  • _regex_split - StringSplit aber mit regulärem Ausdruck als Trenner

    • SOLVE-SMART
    • 6. März 2023 um 19:53

    Hi AspirinJunkie,

    Zitat von AspirinJunkie

    [...] kann sein dass so etwas schonmal ein anderer gemacht hat [...]

    ich meine etwas ähnliches (mit gleichem Ziel) im AutoIt Snippets Thread (des engl. Forums) gesehen zu haben, doch anstatt sich durch die mittlerweile dort 24 pages zu navigieren, kann man nun einfach deine Funktion nutzen 😀 . Danke dir.

    Viele Grüße
    Sven

  • Auto markieren / excel starter

    • SOLVE-SMART
    • 5. März 2023 um 20:50

    Oh wow, wie viel Mühe du dir gibst und dies auch so deutlich und verständlich darstellst Andy, sehr gut, Danke 👍 .
    Sieht vielversprechend aus - bin gespannt ob es zu den Anforderungen von Workflow passt.

    Viele Grüße
    Sven

  • Auto markieren / excel starter

    • SOLVE-SMART
    • 5. März 2023 um 11:25

    Dann bin ich an der Stelle erstmal raus, mit Support usw. Denn der Vorschlag und die Vorgehensweise von Andy sind aus meiner Sicht gut und nachvollziehbar.
    Falls mit VBA hier nicht das entsprechende Ergebnis erreicht wird/werden kann, gib uns bitte hier Bescheid Andy und Workflow, Danke.

    Viele Grüße
    Sven

  • FTP, SFTP + SSH Probleme mit login oder 0Byte-Dateien

    • SOLVE-SMART
    • 3. März 2023 um 21:05

    Hi autoit_dau,

    ich weiß natürlich nicht genau, ob Andy die folgende SFTP UDF meint, doch zumindest kenne ich ansonsten keine Andere.
    Schau mal ob dir das schon hilft 🤞 .

    • 🔗 Download Link "SFTPEx.au3"
    • 🔗 der zugehörige Thread in engl. Forum

    Wichtig sind sicherlich auch die Hinweise im Header der UDF selbst:

    ; Description ...: Functions that assist with SFTP using psftp from PuTTY package.

    ; Exe(s) ........: psftp.exe

    Viel Erfolg 🤝 .


    Viele Grüße
    Sven

  • Umfrage: Tutorial zum WebDriver Projekt ("au3WebDriver" von Danp2)

    • SOLVE-SMART
    • 2. März 2023 um 20:09
    Zitat von BananaJoe

    Ich bin sehr daran interessiert, denn ich mache derzeit die Browserautomation mit UI Automation

    Ich habe mir da auch schon eine UDF geschrieben, um die Redundanzen zu vermeiden. Darum bin ich auf die Alternativer WebDriver gespannt.

    Oh schön 😀 , dann kann ich mir im Gegenzug mal UIAutomation ein wenig von dir erläutern lassen. Fühle dich aber nicht unter Druck gesetzt 😅 . Habe vor Jahren damit mal gearbeitet (2016 glaube ich) und bin nie richtig damit warm geworden. Naja, für den Browser sollte das WebDriver Protokoll (Wire Protokoll) sicherlich besser geeignet sein. Doch schauen wir mal.

    💡 Das deutsche und englische Tutorial, ist übrigens schon wieder synchron => dein "Motivationsschub" half also schon 👍 .

    Viele Grüße

    Sven

  • Auto markieren / excel starter

    • SOLVE-SMART
    • 2. März 2023 um 19:56

    Hi Workflow ,

    Zitat von Workflow

    Die sache ist, ich weiß nicht womit ich anfangen soll.. Ich sehe zwar den Code, aber kann damit nichts anfangen. Wo wird der Code Reinkopiert.. wie aktiviere ich ihn... Ich steig da echt nicht durch.


    Ich brauche eine art Anleitung step für step^^ So als würdest du es einer Omi erklären xD

    Bedeutet das, du hast nicht mal AutoIt installiert bzw. einen Editor für die Code-Erstellung, -Bearbeitung wie SciTE (oder VSCode) bspw.?

    Wenn dem so ist, in Ordnung, du solltest uns nur konkret darauf hinweisen. Denn bisher suchen wir nach dem "Warum" und den Möglichkeiten es so elegant und unkompliziert wie möglich für dich aufzubauen, doch wenn du absoluter Anfänger bist, geben wir dir vielleicht andere Empfehlungen 🤔 .

    💡 Ansonsten bitte ich dich ebenfalls darum, auf den Beitrag von Andy, #14 zu reagieren. Danach, nach deinen Antworten dazu, wissen wir deutlich mehr was du willst und brauchst. Zumindest geht es mir so, ich spreche natürlich nicht für alle.

    Viel Erfolg Workflow 👍 .


    Viele Grüße
    Sven

  • externe Exe im Hintergrund

    • SOLVE-SMART
    • 2. März 2023 um 19:49

    Hallo Windi ,


    wie Peter S. Taler es schon richtig vorgeschlagen hat, ist es sinnvoll die Quelle der Fehleingaben zu bearbeiten und dort zu versuchen diese zu unterbinden. Du hast uns ja nun noch mehr Informationen mit der CSV gegeben, sodass deine eigentliche Anfrage nach den GUI(s), dass man sie bei Bedarf schließen können soll, wohl eher zweitrangig ist.

    Es liegt natürlich an dir, was du als Fokus betrachten möchtest, ich persönlich würde mich auch eher um die Korrektheit der CSVs kümmern und dann um die Darstellung in der GUI.
    Welchen Weg möchtest du weiter verfolgen?

    Viele Grüße

    Sven

  • externe Exe im Hintergrund

    • SOLVE-SMART
    • 2. März 2023 um 14:17

    Hi Windi ,

    soll die erste GUI mit dem Bild noch irgendetwas anderes tun als nur der Hintergrund zu sein? Also muss mit dieser GUI irgendwie interagiert werden?
    Falls nicht, kannst du eine Exe mit "nur dem Hintergrundbild", eine einzelne GUI, erstellen und diese beim Start der eigentlichen GUI mit den Buttons, mit aufrufen. Wenn dann ein Fehler im Prozess auftritt (bei deiner Anwendung/GUI mit den Buttons bzw. den externen Programmen), dann kannst du zumindest immer einzeln die GUI mit dem Hintergrundbild schließen.

    💡 Tipp: Wenn du den Style WS_POPUP (6. Parameter von GuiCreate()) setzt, dann hast du nicht Mal mehr die Titelleiste mit Schließen-Kreuz usw. Ist sicherlich als Hintergrundbild eine gewünschte Option oder?

    Zugegebenermaßen ist dies nur ein Work-around Beispiel. Wenn du mit mehreren GUIs interagieren willst oder diese Nutzen möchtest, dann empfiehlt sich das Konzept Opt('GUIOnEventMode', 0=disable/1=enable) mit GUISetOnEvent und GUICtrlSetOnEvent. Schaue dir dazu mal bitte die Hilfe bzw. deren Beispiele an. Vielleicht bringt dich das ja schon weiter, wie man es machen könnte ohne den oben beschriebenen Work-around.


    Viele Grüße
    Sven

  • Umfrage: Tutorial zum WebDriver Projekt ("au3WebDriver" von Danp2)

    • SOLVE-SMART
    • 28. Februar 2023 um 12:00

    Hey Danke dir BananaJoe 😀🤝 , der Motivationsschub ist angenommen. Mal sehen was die Zukunft bringt.

    Viele Grüße
    Sven

  • Umfrage: Tutorial zum WebDriver Projekt ("au3WebDriver" von Danp2)

    • SOLVE-SMART
    • 27. Februar 2023 um 15:35

    Hi zusammen,

    als kurzes Update: Ich habe das Thema nicht aus den Augen verloren. Es kamen nur andere Dinge, welche wichtiger waren (man kennt dies ja), dem Abschluss des Tutorials zuvor. Nun habe ich zwar freie Spitzen um es zu vollenden und um es dann endlich zu veröffentlichen (Änderungen, Vorschlägen eurerseits etc. natürlich vorbehalten 🤝), jedoch fehlt mir gerade (aus gegebenen Anlass) die Motivation dazu 😔 . Ändert sich hoffentlich bald wieder.

    Werde nun erstmal die engl. Version fertig stellen und komme dann ggf. 🤞 zur deutschen Variante zurück.

    Viele Grüße
    Sven

  • Auto markieren / excel starter

    • SOLVE-SMART
    • 27. Februar 2023 um 13:50

    Hi Workflow,

    ich habe deine Konversation diesbzgl. im engl. Forum verfolgt. Du möchtest das Thema "nur" noch hier fortsetzen, richtig?
    Ich frage nur, damit ich weiß wo in Zukunft eine Antwort/Hilfestellung sinnvoll ist.

    Mit dem Beispiel von water (aus dem engl. Forum) [...]

    AutoIt
    #include <GUIConstantsEx.au3>
    #include <MsgBoxConstants.au3>
    
    GUICreate("Suchen und Ersetzen", 320, 120, @DesktopWidth / 2 - 160, @DesktopHeight / 2 - 45)
    Local $idInput = GUICtrlCreateInput("Example data", 10, 5, 300, 20)
    Local $idMsg = GUICtrlCreateInput("", 10, 30        , 300, 20)
    Local $idBtn = GUICtrlCreateButton("Ok", 40, 75, 60, 20)
    GUISetState(@SW_SHOW)
    
    Sleep(2000)
    ControlSetText("Suchen und Ersetzen", "", $idMsg, "De-Select Text")
    ; DeSelect the Text
    ControlClick("Suchen und Ersetzen", "", $idInput)
    
    Sleep(2000)
    ControlSetText("Suchen und Ersetzen", "", $idMsg, "Select Text")
    ; Select the Text
    ControlSend("Suchen und Ersetzen", "", $idInput, "^a")
    
    ; Loop until the user exits.
    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                ExitLoop
            Case $idBtn
                ExitLoop
        EndSwitch
    WEnd
    Alles anzeigen

    [...] konntest du bisher noch nichts anfangen? Was genau verstehst du noch nicht?

    Viele Grüße
    Sven

  • Splash Screen in Schleife

    • SOLVE-SMART
    • 26. Februar 2023 um 06:28

    Hi Andy ,

    Zitat von Andy

    Nein. Wenn $a kein Array ist, dann gibts auch kein Ubound und die Schleife endet.

    Ja ich meinte nicht die For-Schleife sondern die äußere While Schleife.

    Zitat von Andy

    Das ist doch Sinn und Zweck! Nur wenn das TrayFenster sichtbar ist, wird der Splashtext angezeigt!

    Da hast du Recht. Ich war wohl in geistiger Umnachtung gestern Abend 😅 .
    Damit ist auch das Thema Array $a von oben hinfällig.

    Übrigens auch gute Idee, die Warnungen gleich zusammenzufassen 👍 .


    Ein letzter kleiner Hinweis an casi4712 noch:
    Abgesehen von den beiden folgenden "includes" brauchst du die anderen im Skript nicht.

    AutoIt
    #include-once
    #include <GuiToolTip.au3>
    #include <WinAPISys.au3>

    Viele Grüße
    Sven

  • Splash Screen in Schleife

    • SOLVE-SMART
    • 25. Februar 2023 um 21:42

    Hi casi4712 ,

    zunächst der Hinweis: Ich habe "Tidy AutoIt Source", CTRL+T in SciTE, über dein Skript laufen lassen, sodass du im folgenden Code etwas andere Einrückungen sehen wirst. Also nicht verwundert sein 😀 .

    Des Weiteren habe ich Markierungen an gewisse Stellen deines Codes gesetzt, um zu sehen ob überhaupt in die jeweilige Funktion gegangen wird. Dies habe ich einfach mit ConsoleWrite('Bookmark #1' & @CRLF) #2, #3 etc. gemacht. In deiner Funktion Warn2() habe ich den SplashOff() wieder einkommentiert (dieser Befehl war ein Kommentar). Abgesehen davon lief ich bei meinem Test in die FunktionWarn2() und habe den Splash Text angezeigt bekommen.

    AutoIt
    #include <GuiToolTip.au3>
    #include <TrayConstants.au3>
    #include <GuiToolTip.au3>
    #include <MemoryConstants.au3>
    #include <WinAPISys.au3>
    #include <GuiToolTip.au3>
    
    TraySetIcon("authui.dll", -0)
    
    Global $LowRam = 5 ; GB
    Global $ChargeLow = 60
    Global $ProcLoadHi = 90
    
    Global $NewFreeRam, $NewBatState, $conDat, $NewProcLoad, $NewfltDriveFreeSpace, $aData
    Global $strDrive = "C:\", _
            $PreviousfltDriveFreeSpace = GetDriveFreeSpace($strDrive), _
            $fltDriveLowSpace = 20 ; GB
    $sPreviousFreeRam = GetFreeRam()
    $sPreviousBatState = _BatteryStatus()
    $sPreviousconState = _AcCON()
    $sPreviousProcLoad = GetCPUavg()
    
    ManageTrayIcon()
    
    Func ManageTrayIcon()
        TraySetToolTip($sPreviousFreeRam & " GB" & " Free RAM" & @CRLF & "Aufgeladen: " & $sPreviousBatState & "%" & @CRLF & "Prozessor Auslastung :" & $sPreviousProcLoad & " %" & @CRLF & $sPreviousconState & @CRLF & "SytemDrive free on '" & $strDrive & "' : " & $PreviousfltDriveFreeSpace & " GB")
    
        While True
            $a = WinList("[CLASS:tooltips_class32]")
            For $i = 1 To UBound($a) - 1
                If WinGetTitle($a[$i][1]) = $sPreviousFreeRam Then
                    $NewfltDriveFreeSpace = GetDriveFreeSpace($strDrive)
                    $NewFreeRam = GetFreeRam()
                    $NewBatState = _BatteryStatus()
                    $NewConState = _AcCON()
                    $NewProcLoad = GetCPUavg()
                    $NewTitle = "Health Status"
    
                    ConsoleWrite('Bookmark #1' & @CRLF)
    
                    If $NewFreeRam <> $sPreviousFreeRam Then
                        ConsoleWrite('Bookmark #2' & @CRLF)
                        ConsoleWrite(WinGetTitle($a[$i][1]) & @CRLF)
    
                        TraySetToolTip($NewFreeRam & " GB" & " Free RAM" & @CRLF & "Aufgeladen: " & $NewBatState & "%" & @CRLF & "Prozessor Auslastung :" & $NewProcLoad & " %" & @CRLF & $NewConState & @CRLF & "SytemDrive free on '" & $strDrive & "' : " & $NewfltDriveFreeSpace & " GB")
                        _checks()
    
                        WinSetTitle($a[$i][1], "", $NewFreeRam)
                        ControlSetText($a[$i][1], "", "", $NewFreeRam)
                        _GUIToolTip_Update($a[$i][1])
                        $sPreviousFreeRam = $NewFreeRam
                    EndIf
                EndIf
            Next
            ; Sleep(10)
        WEnd
    EndFunc   ;==>ManageTrayIcon
    
    Func _checks()
        ;RAM LEVEL
        If ($NewFreeRam <= $LowRam) Then
            Warn()
        EndIf
    
        ;SPACE Level
        If $NewfltDriveFreeSpace > $ProcLoadHi Then
            Warn2()
        EndIf
    
        ;Charge Level
        If $NewBatState <= $ChargeLow And ($conDat = 0) Then
            Warn3()
        EndIf
    
        ;Last Level
        If $NewProcLoad > $ProcLoadHi Then
            Warn4()
        EndIf
    EndFunc   ;==>_checks
    
    Func _BatteryStatus()
        $aData = _WinAPI_GetSystemPowerStatus()    ; Array mit Batterie Werten einlesen
        $ChargeDat = $aData[2]
        Return $ChargeDat
    EndFunc   ;==>_BatteryStatus
    
    Func _AcCON()
        $bData = _WinAPI_GetSystemPowerStatus()     ; Array mit Batterie Werten einlesen
        $conDat = $aData[0]
        If $conDat = 0 Then
            $ConDatR = "Kein Netzteil"
        Else
            $ConDatR = "Netzteil angeschlossen"
        EndIf
        Return $ConDatR
    EndFunc   ;==>_AcCON
    
    Func GetFreeRam() ; verfügbarern RAM ermitteln
        $aMemStats = MemGetStats()
        Return Round($aMemStats[$MEM_AVAILPHYSRAM] / 1024 / 1024, 2)
    EndFunc   ;==>GetFreeRam
    
    Func GetDriveFreeSpace($strDrive)
        Return Round((DriveSpaceFree($strDrive) / 1024), 1)
    EndFunc   ;==>GetDriveFreeSpace
    
    Func GetCPUavg()
        Local $objWMIService, $objProcessList, $objProcess, $iLoad
        $iLoad = 0
        $objWMIService = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
        $objProcessList = $objWMIService.ExecQuery("SELECT * FROM Win32_Processor")
        For $objProcess In $objProcessList
            $iLoad = $iLoad + $objProcess.LoadPercentage
        Next
        Return $iLoad
    EndFunc   ;==>GetCPUavg
    
    Func Warn()
        ConsoleWrite('Bookmark #3' & @CRLF)
        SplashTextOn("Splash", "RAM wird knapp", 450, 45, 1400, 1000, 1, "Verdana")
        Sleep(8000)
        SplashOff()
    EndFunc   ;==>Warn
    
    Func Warn2()
        ConsoleWrite('Bookmark #4' & @CRLF)
        SplashTextOn("Splash", "Speicherplatz auf dem SystemDrive wird knapp", 450, 45, 1400, 1000, 1, "Verdana")
        Sleep(7000)
        SplashOff()
    EndFunc   ;==>Warn2
    
    Func Warn3()
        ConsoleWrite('Bookmark #5' & @CRLF)
        SplashTextOn("Splash", "Batterie wird knapp, bitte laden!!!", 450, 45, 1400, 1000, 1, "Verdana")
        Sleep(7000)
        SplashOff()
    EndFunc   ;==>Warn3
    
    Func Warn4()
        ConsoleWrite('Bookmark #6' & @CRLF)
        SplashTextOn("Splash", "Sehr hohe Prozessor Auslastung!!!", 450, 45, 1400, 1000, 1, "Verdana")
        Sleep(7000)
        SplashOff()
    EndFunc   ;==>Warn4
    Alles anzeigen

    💡 Kann somit nicht nachvollziehen, warum es bei dir nicht funktioniert (vorausgesetzt die Schwellenwerte sind unterschritten, die du ja selbst festlegst).

    Zitat von casi4712

    Ich hoffe es sing keine Globals mehr innerhalb der Funktionen,

    Nein, alles okay diesbezüglich. Allerdings ist deine While Schleife nicht gerade CPU freundlich 😔 . Du solltest bei $a = WinList("[CLASS:tooltips_class32]") darauf prüfen, ob du überhaupt ein Array zurück bekommst und falls nicht irgendetwas tun (aus der Schleife springen etc.). Denn ansonsten läuft dein Skript ohne Auswertung (von RAM, Batterie etc.) einfach weiter und dann bekommst du auch kein Splash Text angezeigt.

    Hoffe dir helfen diese Tipps etwas 🤞 .

    Viele Grüße
    Sven

  • GUI mit benutzerdefinierter Titelleiste

    • SOLVE-SMART
    • 23. Februar 2023 um 20:48

    Hi ihr beiden ( Kanashius, Mars) 👋 ,

    zunächst einmal Danke 😀 .

    Vielleicht kurz zur Intension:
    Das Ganze war nicht mehr als ein proof of concept (POC) und zum Spaß. Zugegebenermaßen gab es eine Frage dazu im engl. Forum, doch das spielte nicht wirklich eine Rolle.

    Nun zu euren Anmerkungen:

    Zitat von Kanashius

    Bei mir haben der Schließen (Í) und Maximieren-button (£) ein falsches Symbol (auch hier auf der Webseite; keine Ahnung, wo es falsch konvertiert wurde). Ich würde empfehlen mit ChrW die UTF-codes direkt zu nutzen, dann kann sowas nicht passieren. Für mein Tool hab ich z.B. minimize: ChrW(0x2015), maximize: ChrW(0x2610) und close: ChrW(0x2715)

    Das sind nicht die falschen Symbole sondern die, die ich aus der Zeichentabelle (Character Map) von Windows bzgl. der Schriftart Wingdings 2 entnommen habe.

    Allerdings hast du Recht, ChrW zu nutzen ist sicherlich sinnvoller und führt weniger zu Verwirrung (wie wir festgestellt haben 😅). Ich ändere das im Beitrag #1 ab.

    Zitat von Kanashius

    Verbesserung:

    1. Doppelkick auf die Titleleiste maximiert/entmaximiert ein Fenster, sollte recht leicht zu implementieren sein.

    2. Eigenes resize implementieren; relativ einfach, aber aufwändiger.

    Für dieses Beispiel out of scope, dennoch ein absolut relevanter Verbesserungsvorschlag 👍 .

    Zitat von Kanashius

    AeroSnap und FancyPages [...]

    Ebenfalls out of scope, verstehe aber deine Ausführungen absolut.

    Zitat von Kanashius

    Es ist leider ziemlich nervig, dass sobald man die Standard Titlebar wegnimmt (Window style undecorated), fast alle Funktionalität für ein normales Fenster mit verschwindet... Vor allem, weil auch die Standard Testenkombinationen mit wegfallen.

    Auch hierzu kann ich nur Beipflichten und sagen ja, nervig! Danke dir Kanashius 🤝 .


    Zitat von Mars

    Kleiner Hinweis wie du die Events nicht andauernd via Adlib durchlaufen musst: Verwende GUIOnEventMode und registriere dir GUI_EVENT_MOUSEMOVE. Dann wird die Funktion nur aufgerufen, wenn die Maus bewegt wird. Dadurch wird dein Programm nebenbei auch sehr viel reaktiver, weil nicht "alle 100ms" geprüft wird, sondern "sobald sich die Maus einen Pixel bewegt". Gleichzeitig wird keine Rechenleistung verbraucht wenn die Maus stillsteht.

    Sehr guter Hinweis Mars. Bisher habe ich nie mit Opt('GUIOnEventMode', 1) gearbeitet. Kenne die Variante zwar, braucht sie nur bisher nie. Auf Grund deines Beispiels sehe ich jedoch die Sinnhaftigkeit absolut gegeben, Danke 👍 .

    Zitat von Mars

    Noch eine Idee wäre WM_NCHITTEST & Return $HTCAPTION [...] ob, und wie das sinnvoll ist, aber vielleicht bringt die die Info ja etwas :)
    [...] (PS: NCHITTEST feuert 1x pro Frame, also alle 16.6ms. Wenn man es nicht braucht sollte man es also vllt doch lieber weglassen^^)

    Danke für den Exkurs, sehr angenehm wie du das beschreibst 🤣 .

    Zitat von Mars

    GUIGetCursorInfo trägt bereits informationen zum Ctrl in [4], da braucht man nicht mehr umständlich via Positionen zu berechnen wo die Maus ist.

    Sehr guter Hinweis, hätte ich eigentlich selbst wissen müssen/sollen 🤔 . Versuche es zeitnah in den Code einzupflegen (oben zu aktualisieren).

    Zitat von Mars

    Bei Ctrls Farben zu aktualisieren tendiert zu flackern (auch wenn man es hier jetzt nicht wirklich sieht). Versuche die aktuellen Daten (Farbe, Schriftfarbe, Symbol, etc) nur dann zu aktualisieren wenn sich etwas ändert.

    Ja das ist mir klar. Ich denke hier war einfach der prototypische Ansatz interessanter und ausreichender, als es in den Reifegrad "produktiv" zu bringen 😅 .

    Zitat von Mars

    Edit: Es gibt auch noch eine Menge andere WM_XXX die man gebrauchen könnte. Am besten mal alle durchlesen (sind leider ziemlich viele^^).


    Edit2: https://www.autoitscript.com/wiki/Moving_an…zing_PopUp_GUIs <- Pflichtlektüre 8)

    Auf Grund von anderer Arbeit, kann ich dir hier nichts versprechen, dass ich mir dies zu Gemüte führe (auch wenn es "Pflichtlektüre" ist 😁), trotzdem sehr guter Hinweis Mars , Danke dir 🤝 .

    Viele Grüße
    Sven

  • AutoIt Cheat Sheet

    • SOLVE-SMART
    • 23. Februar 2023 um 20:19

    Hi Moombas,

    ich Danke dir für deine Einschätzung 👍 . Const, Static und Co. habe ich mit Absicht weggelassen. Auch die Beschreibung von Arrays und deren Nutzung ist nicht mit dabei, denn ansonsten müsste ich ggf. auch auf andere Datentypen wie Maps, Structs, Booleans etc. eingehen - wo setze ich da die Grenze/wo grenze ich ab?

    Ich gebe dir Recht, dass gerade für AutoIt Arrays essenziell sind, doch so ein Cheat Sheet dient zunächst erstmal dem groben Überblick. Details sollten dann in Recherchen bzw. Referenzen wie der Hilfe/Dokumentation nachgelesen werden. Es ist so schon eher ungewöhnlich, dass das Cheat Sheet 3 - 4 Seiten (als PDF) lang ist. Üblicherweise (schaue gerne einfach mal bei Cheat Sheets von JavaScript, Python, C# etc. nach), sind es zwei Seiten - also nur das Nötigste.

    => Daher fiel es mir ziemlich schwer zu entscheiden was rein kommt und was nicht.
    => Ich habe mich an vielen anderen Cheat Sheets orientiert.

    Viele Grüße
    Sven

  • GUI mit benutzerdefinierter Titelleiste

    • SOLVE-SMART
    • 23. Februar 2023 um 16:28

    Hi zusammen 👋 ,

    hier nur ganz kurz vorgestellt, ein kleines Skript welches eine GUI darstellt, die eine benutzerdefinierte Titelleiste hat. Ich bin mir sicher das es da bereits etliche Varianten gibt, wie Metro GUI usw., trotzdem wollte ich es einfach mal geteilt haben. Vielleicht hilft es den einen oder anderen (vielleicht auch nur als Ideengeber für andere Projekte oder so).

    💡 Warum? Den Hintergrund der Titelleiste und die Schriftfarbe der Titelleiste zu ändern, ist gar nicht so trivial. Daher hier ein Weg eine eigene Titelleiste stattdessen zu nutzen.

    AutoIt
    #AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7
    #AutoIt3Wrapper_AU3Check_Stop_OnWarning=y
    #AutoIt3Wrapper_Run_Au3Stripper=y
    #AutoIt3Wrapper_UseUpx=n
    #Au3Stripper_Parameters=/sf /sv /mo /rm /rsln
    
    #include-once
    #include <GUIConstants.au3>
    #include <Misc.au3>
    
    Global $mGui[], $mTitleBar[]
    Global $mClosingCrossIcon[], $mMinimizeIcon[]
    
    Global $mTitleBarColor[]
    $mTitleBarColor.background    = 0xD9534F
    $mTitleBarColor.font          = 0xFBEDED
    $mTitleBarColor.faviconIcon   = $GUI_BKCOLOR_TRANSPARENT
    $mTitleBarColor.hoverMinimize = 0xE5E5E5
    $mTitleBarColor.hoverClose    = 0xE81123
    
    _Actions()
    
    Func _Actions()
        _CreateGui()
        _CreateTitleBar()
        _AddTitleBarButtons()
        _ShowGui()
        _GuiEventListener()
    EndFunc
    
    Func _CreateGui()
        $mGui.Width  = 600
        $mGui.Height = 350
        $mGui.Style  = $WS_POPUP
        $mGui.Handle = GUICreate('', $mGui.Width, $mGui.Height, Default, Default, $mGui.Style)
    EndFunc
    
    Func _CreateTitleBar()
        ; background
        $mTitleBar.X            = 0
        $mTitleBar.Y            = 0
        $mTitleBar.W            = ($mGui.Width - 137)
        $mTitleBar.H            = 26
        $mTitleBar.ButtonWidth  = 25
        $mTitleBar.ButtonHeight = $mTitleBar.ButtonWidth
    
        $mTitleBar.cId = GUICtrlCreateLabel('', $mTitleBar.X, $mTitleBar.Y, $mTitleBar.W, $mTitleBar.H)
        GUICtrlSetBkColor($mTitleBar.cId, $mTitleBarColor.background)
        GUICtrlSetStyle($mTitleBar.cId, -1, $GUI_WS_EX_PARENTDRAG)
    
        ; favicon icon
        GUICtrlCreateLabel('🎲', 4, 5.5) ; I used the cube icon as example which can be pasted in by pressing [WIN] + [.]
        GUICtrlSetBkColor(-1, $mTitleBarColor.faviconIcon)
        GUICtrlSetFont(-1, 11)
    
        ; title
        GUICtrlCreateLabel('GUI with custom title bar', 24, 5.5, ($mGui.Width / 2))
        GUICtrlSetColor(-1, $mTitleBarColor.font)
        GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
        GUICtrlSetFont(-1, 9)
    EndFunc
    
    Func _AddTitleBarButtons()
        _AddClosingCrossIcon()
        _AddMaximizeIcon()
        _AddMinimizeIcon()
    EndFunc
    
    Func _AddClosingCrossIcon()
        ; background
        $mClosingCrossIcon.X = ($mGui.Width - 45)
        $mClosingCrossIcon.Y = 0
        $mClosingCrossIcon.W = $mTitleBar.ButtonWidth + 20
        $mClosingCrossIcon.H = $mTitleBar.ButtonHeight + 1
    
        $mClosingCrossIcon.cId = GUICtrlCreateLabel('', $mClosingCrossIcon.X, $mClosingCrossIcon.Y, $mClosingCrossIcon.W, $mClosingCrossIcon.H)
        GUICtrlSetBkColor($mClosingCrossIcon.cId, $mTitleBarColor.background)
    
        ; icon
        GUICtrlCreateLabel(ChrW(0xCD), ($mGui.Width - 31), 5.5, $mTitleBar.ButtonWidth, $mTitleBar.ButtonHeight)
        GUICtrlSetFont(-1, 14, 100, Default, 'Wingdings 2')
        GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
    EndFunc
    
    Func _AddMaximizeIcon()
        ; background
        GUICtrlCreateLabel('', ($mGui.Width - 92), 0, $mTitleBar.ButtonWidth + 22, $mTitleBar.ButtonHeight + 1)
        GUICtrlSetBkColor(-1, $mTitleBarColor.background)
    
        ; icon
        GUICtrlCreateLabel(ChrW(0xA3), ($mGui.Width - 75), 6.5, $mTitleBar.ButtonWidth, $mTitleBar.ButtonHeight)
        GUICtrlSetFont(-1, 11, 100, Default, 'Wingdings 2')
        GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
        GUICtrlSetColor(-1, 0xCCCCCC)
    EndFunc
    
    Func _AddMinimizeIcon()
        ; background
        $mMinimizeIcon.X = ($mGui.Width - 137)
        $mMinimizeIcon.Y = 0
        $mMinimizeIcon.W = $mTitleBar.ButtonWidth + 20
        $mMinimizeIcon.H = $mTitleBar.ButtonHeight + 1
    
        $mMinimizeIcon.cId = GUICtrlCreateLabel('', $mMinimizeIcon.X, $mMinimizeIcon.Y, $mMinimizeIcon.W, $mMinimizeIcon.H)
        GUICtrlSetBkColor($mMinimizeIcon.cId, $mTitleBarColor.background)
    
        ; icon
        GUICtrlCreateLabel(ChrW(0x2015), ($mGui.Width - 119), 6.5, $mTitleBar.ButtonWidth, $mTitleBar.ButtonHeight)
        GUICtrlSetFont(-1, 8, 100, Default, 'Segoe UI')
        GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
    EndFunc
    
    Func _ShowGui()
        GUISetState(@SW_SHOW, $mGui.Handle)
    EndFunc
    
    Func _GuiEventListener()
        AdlibRegister('_HoverActions', 100)
        Local Const $iGuiEventClose = -3
    
        While True
            Switch GUIGetMsg()
                Case $iGuiEventClose, $mClosingCrossIcon.cId
                    ExitLoop
                Case $mMinimizeIcon.cId
                    GUISetState(@SW_MINIMIZE, $mGui.Handle)
            EndSwitch
        WEnd
    
        _GuiDisposeAndExit()
    EndFunc
    
    Func _GuiDisposeAndExit()
        AdlibUnRegister('_HoverActions')
        GUIDelete($mGui.Handle)
        Exit
    EndFunc
    
    Func _HoverActions()
        Local $aMouseData = MouseGetPos()
        Local $aGuiData   = WinGetPos($mGui.Handle)
    
        If Not _HoverTitleBar($aMouseData, $aGuiData) Then
            _ResetHoverColor()
            Return
        EndIf
    
        Select
            Case _HoverMinimizeIcon($aMouseData, $aGuiData)
                GUICtrlSetBkColor($mMinimizeIcon.cId, $mTitleBarColor.hoverMinimize)
                GUICtrlSetBkColor($mClosingCrossIcon.cId, $mTitleBarColor.background)
    
            Case _HoverClosingCrossIcon($aMouseData, $aGuiData)
                GUICtrlSetBkColor($mClosingCrossIcon.cId, $mTitleBarColor.hoverClose)
                GUICtrlSetBkColor($mMinimizeIcon.cId, $mTitleBarColor.background)
    
            Case Else
                _ResetHoverColor()
        EndSelect
    EndFunc
    
    Func _ResetHoverColor()
        GUICtrlSetBkColor($mClosingCrossIcon.cId, $mTitleBarColor.background)
        GUICtrlSetBkColor($mMinimizeIcon.cId, $mTitleBarColor.background)
    EndFunc
    
    Func _HoverTitleBar($aMouseData, $aGuiData)
        Return _IsMouseOnControl( _
            $aMouseData[0] - $aGuiData[0], _
            $aMouseData[1] - $aGuiData[1], _
            $mTitleBar.X, $mTitleBar.Y, $mGui.Width, $mTitleBar.H)
    EndFunc
    
    Func _HoverMinimizeIcon($aMouseData, $aGuiData)
        Return _IsMouseOnControl( _
            $aMouseData[0] - $aGuiData[0], _
            $aMouseData[1] - $aGuiData[1], _
            $mMinimizeIcon.X, $mMinimizeIcon.Y, $mMinimizeIcon.W, $mMinimizeIcon.H)
    EndFunc
    
    Func _HoverClosingCrossIcon($aMouseData, $aGuiData)
        Return _IsMouseOnControl( _
            $aMouseData[0] - $aGuiData[0], _
            $aMouseData[1] - $aGuiData[1], _
            $mClosingCrossIcon.X, $mClosingCrossIcon.Y, $mClosingCrossIcon.W, $mClosingCrossIcon.H)
    EndFunc
    
    Func _IsMouseOnControl($iXMouse, $iYMouse, $iXControl, $iYControl, $iWidthControl, $iHeightControl)
        If $iXMouse >= $iXControl And _
           $iYMouse >= $iYControl And _
           $iXMouse <= $iXControl + $iWidthControl  And _
           $iYMouse <= $iYControl + $iHeightControl Then
           Return True
        Else
            Return False
        EndIf
    EndFunc
    Alles anzeigen

    Gut zu wissen:

    • man kann das Fenster ganz normal mittels der Titelleiste ziehen
    • man kann den Minimize- und den Schließen-Button ganz normal benutzen
      • klingt trivialer als es ist 😅
    So sieht das bspw. dann aus

    Standard GUI

    Benutzerdefinierte GUI

    Vielleicht kann es ja mal jemand gebrauchen 🤞 .

    Viele Grüße
    Sven

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™