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. Oscar

Beiträge von Oscar

  • _GuiCtrlSetImageEx

    • Oscar
    • 21. Juni 2018 um 09:39

    Ja, die UDF ist schon älter! ;)

    Aber nachdem ich sie schon mehrmals benutzt habe (und jedes Mal etwas verändert), dachte ich, es wird mal Zeit die aktuelle Version hier hochzuladen.

    Wie in Post#1 erwähnt, habe ich inzwischen die Parameterübergabe komplett verändert. Diese Version also nicht gegen eine alte Version austauschen!

  • Zeit ändern per MouseWheel

    • Oscar
    • 21. Juni 2018 um 08:40

    Für meine Digitaluhr habe ich ja die Alarmzeit per MouseWheel einstellbar gemacht.

    Falls ihr so etwas auch machen wollt, hier mal ein kleines, kommentiertes Minimal-Beispiel:

    AutoIt
    #include <GUIConstantsEx.au3>
    #include <WinAPIGdi.au3>
    #include <WindowsConstants.au3>
    
    Global $hGui = GUICreate('Zeit ändern per MouseWheel', 350, 200)
    Global $aidClock[3]
    For $i = 0 To 2
        $aidClock[$i] = GUICtrlCreateLabel('00', 60 + $i * 80, 20, 50, 44)
        GUICtrlSetFont(-1, 32, 800, 0, 'Courier New')
    Next
    GUICtrlCreateLabel(':', 112, 20, 26, 44)
    GUICtrlSetFont(-1, 32, 400, 0, 'Courier New')
    GUICtrlCreateLabel(':', 192, 20, 26, 44)
    GUICtrlSetFont(-1, 32, 400, 0, 'Courier New')
    
    GUISetState()
    GUIRegisterMsg($WM_MOUSEWHEEL, '_WM_MOUSEWHEEL')
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    
    Func _WM_MOUSEWHEEL($hWnd, $iMsg, $wParam, $lParam)
        Local Const $aMaxVal[3] = [23, 59, 59], $iWheelDelta = 120
        Local $iWheel, $aGuiInfo, $iIndex, $iValue
        $iWheel = _WinAPI_HiWord($wParam) / $iWheelDelta ; HiWord(wParam) / WheelDelta ergibt down = -1, up = 1
        $aGuiInfo = GUIGetCursorInfo($hWnd) ; $aGuiInfo[4] enthaelt die Ctrl-ID vom Control unter dem Mauszeiger
        $iIndex = $aGuiInfo[4] - $aidClock[0] ; minus der Ctrl-ID vom ersten Label ergibt 0...2 fuer die Clock-Labels
        If $iIndex < 0 Or $iIndex > 2 Then Return $GUI_RUNDEFMSG ; wenn Mauszeiger ausserhalb, dann Funktion verlassen
        $iValue = GUICtrlRead($aidClock[$iIndex]) + $iWheel ; Wert auslesen und Wheelwert (-1 oder 1) addieren
        If $iValue > $aMaxVal[$iIndex] Then $iValue = 0 ; wenn neuer Wert groesser als Maximalwert, dann 0
        If $iValue < 0 Then $iValue = $aMaxVal[$iIndex] ; wenn neuer Wert kleiner als 0, dann Maximalwert
        _WinAPI_LockWindowUpdate($hWnd) ; WindowUpdate blockieren (verhindert das flackern beim aendern der Werte)
        GUICtrlSetData($aidClock[$iIndex], StringFormat('%02i', $iValue)) ; neuen Wert setzen
        _WinAPI_LockWindowUpdate(0) ; WindowUpdate wieder freigeben
        Return $GUI_RUNDEFMSG
    EndFunc   ;==>_WM_MOUSEWHEEL
    Alles anzeigen
  • Digitaluhr v4

    • Oscar
    • 20. Juni 2018 um 18:50
    Zitat von Bitnugger

    Bei mir wird erst Total Commander (maximiert) gestartet und dann die DigitalUhr... die dann aber nicht auf dem Desktop ist.

    Ach, so meinst Du das!

    Nein, aber ich will die Digitaluhr nicht nur auf dem Desktop haben. Ich möchte schon, dass es ein Fenster ist, was man nach vorne holen kann. Deswegen ja auch der Menüpunkt im Traymenü.

  • Digitaluhr v4

    • Oscar
    • 20. Juni 2018 um 18:32
    Zitat von Bitnugger

    Die Digitaluhr soll ja wahrscheinlich nur auf dem Desktop angezeigt werden... bevor du sie anzeigst, solltest du also prüfen, ob dieser sichbar/aktiviert ist.

    Hmm...jetzt bin ich etwas verwirrt. Ist das beim starten aus dem @StartupDir nicht automatisch so?

    Ich dachte, dass die Programme aus dem User-Startup erst gestartet werden, wenn der Desktop geladen/aktiv ist.

  • Digitaluhr v4

    • Oscar
    • 20. Juni 2018 um 17:40
    Zitat von Bitnugger

    Das Ergebnis von _WinAPI_GetVersion muss also vor der Prüfung in eine Zahl umgewandelt werden, damit der Vergleich wie beabsichtigt funktioniert.

    Ah ja! Blöder Bug! X(

    Zitat von autoiter

    Dann benutzt ihr wahrscheinlich noch nicht die AutoIt-Version 3.3.14.5?

    Bei mir ist der Rückgabewert eine Nummer.

    Das erklärt, warum es nach dem neu kompilieren funktioniert.

    Ich habe noch 3.3.14.2.

    Edit:

    Na gut, dann gibt es noch eine neue Version (v4.2.1). So könnt ihr den Update-Button ausprobieren. :)

  • Digitaluhr v4

    • Oscar
    • 20. Juni 2018 um 17:21
    Zitat von turbobaby

    bei meiner Windows 10 Pro Version bekomme ich angezeigt:

    Systemvoraussetzung nicht erfüllt! Windows Vista oder höher wird benötigt.

    Nanu?

    Was wird denn bei Win10 hiermit ausgegeben?

    AutoIt
    #include <WinAPISys.au3>
    ConsoleWrite(_WinAPI_GetVersion() & @CR)
  • Digitaluhr v4

    • Oscar
    • 20. Juni 2018 um 10:12

    So, das neue Update ist fertig (siehe Post#1).

    Wer möchte, kann sich jetzt über den Update-Button auf dem Programminformationsfenster die aktuelle Exe-Datei direkt von meiner Homepage holen (siehe dazu auch den Hinweis in Post#1).

    Ich habe mit Absicht kein Auto-Update eingebaut, weil ich es hasse, dass "alle" Programme ungefragt im Internet nachsehen, ob es eine neue Version gibt. Bei mir muss man das "checken" anklicken und dann das eigentliche "updaten".

  • Digitaluhr v4

    • Oscar
    • 20. Juni 2018 um 05:21
    Zitat von autoBert

    Ich habe aber trotzdem eine Bitte an dich, da ich keine Maus sondern ein Touchpad benutze ist die Einstellung der Alarmzeiten nicht möglich.

    Ja stimmt, das ist suboptimal! Ich werde mal sehen, dass ich da noch eine Tastatureinstellung möglich mache.

    Zitat von autoBert

    Ein Mini-Bug ist mir auch noch aufgefallen: Der Hinweis "Anklicken zum Stellen der Alarmzeit" erscheint auch während des Stellens. Sollte dann doch zu "Anklicken um zur akt. Zeit zurückzukehren" geändert werden.

    Ja, auch das! Danke, für den Hinweis! :)

    Ich arbeite sowieso gerade an der v4.2er Version. Da war noch ein Bug mit dem Konfigurationsfenster (nach speichern wird der Kalender nicht aktualisiert).

    Außerdem wird es dann eine Update-Funktion geben.

  • Wenn Programm nicht gestartet dann abfrage ob starten oder nicht

    • Oscar
    • 18. Juni 2018 um 17:56

    Na gut, weil ich gerade Lust dazu hatte:

    AutoIt
    #include <WindowsConstants.au3>
    
    Global Const $sProcessPath = @SystemDir & '\calc.exe'
    Global $iPID = _CheckProcess($sProcessPath, 10)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $iPID = ' & $iPID & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    
    Func _CheckProcess($sProcessPath, $iTimeout = 30)
        Local $sProcess, $hGui, $idCheckNo, $idCheckYes, $iTimer, $iSeconds, $iOldSeconds = -1
        $sProcess = StringRegExpReplace($sProcessPath, '.+\\(.+)', '$1')
        $hGui = GUICreate('CheckProcess', 320, 120, -1, -1, BitOR($WS_POPUP, $WS_CAPTION))
        GUISetFont(12, 400, 0, 'Arial')
        GUICtrlCreateLabel(StringFormat('Der Prozess "%s" läuft nicht!\nSoll der Prozess gestartet werden?', $sProcess), 10, 10, 300, 40)
        $idCheckNo = GUICtrlCreateButton('Nein', 80, 80, 100, 28)
        $idCheckYes = GUICtrlCreateButton('Ja', 190, 80, 100, 28)
        $iTimer = TimerInit()
        GUISetState(@SW_SHOW, $hGui)
        While Not ProcessExists($sProcess) And $iSeconds < $iTimeout
            Switch GUIGetMsg()
                Case $idCheckNo
                    ExitLoop
                Case $idCheckYes
                    ShellExecute($sProcessPath)
            EndSwitch
            $iSeconds = Int(TimerDiff($iTimer) / 1000)
            If $iSeconds <> $iOldSeconds Then
                $iOldSeconds = $iSeconds
                GUICtrlSetData($idCheckNo, StringFormat('Nein  (%is)', $iTimeout - $iSeconds))
            EndIf
        WEnd
        GUIDelete($hGui)
        Return ProcessExists($sProcess)
    EndFunc
    Alles anzeigen
  • Wie kann man eine GUI vor der Displayskalierung schützen?

    • Oscar
    • 18. Juni 2018 um 17:06
    Zitat von hipfzwirgel

    dann wird die GUI am rechten und unteren Monitorrand abgeschnitten

    Nicht notwendigerweise!

    Dafür gibt es die Makros: @DesktopWidth und @DesktopHeight

    Eine komplett dynamische GUI ist aber sehr schwer zu erstellen. Gerade das Resizing ist mit AutoIt schon eine Herausforderung.

    Im Prinzip müsstest Du für alle Gui-Elemente nur die ungefähre Position festlegen, dann die Fenstermaße ermitteln und anhand der Maße die Gui-Elemente erstellen, sowie die Schriftgröße ermitteln.

    Wie gesagt, das ist sehr aufwendig!

    Eventuell kannst Du es Dir einfacher machen, wenn es "nur" ein paar Standard-Auflösungen gibt. Dann könntest Du mehrere, verschiedene GUIs erstellen und je nach Monitorauflösung benutzen.

  • Digitaluhr v4

    • Oscar
    • 17. Juni 2018 um 15:59

    Diese vierte Version meiner Digitaluhr ist ziemlich speziell auf meine Anforderungen ausgerichtet, deswegen weiß ich gar nicht, ob ihr damit etwas anfangen könnt.

    Das geht schon mit der Größe des Fensters los (400 x 743 Pixel plus Rahmen). Das mag manchem zu groß für eine Uhr sein, aber mein Programm ist ja auch nicht nur eine Uhr.

    Vielleicht sollte ich erstmal aufzählen, was mein Programm alles anzeigt.

    Liste der Anzeigen:

    - Uhrzeit

    - Datum

    - Wochentag (ausgeschrieben)

    - Wochennummer

    - Die deutschen Feiertage (alle, auch wenn sie nicht das eigene Bundesland betreffen)

    - Zwei Alarmzeiten (Anzeige umschaltbar)

    - Vier Abfalltonnen (Altpapier, Gelber Sack, Restmüll, O-Tonne)

    - Sommerzeit (Beginn und Ende)

    - Sonnenaufgang und -untergang (Zeiten)

    - Countdown bis zum nächsten Urlaub (in Tagen, Stunden und Minuten)

    - Jahreszeitgrafik

    - den Beginn der 4 Jahreszeiten (Datum und Uhrzeit)

    - Monatskalender (aktueller Monat) mit Markierung von Geburts-, Hochzeits- und Jahrestagen

    Abfalltonnen:

    Das mit den Abfalltonnen habe ich aufgenommen, weil ich mir immer nicht merken kann, welche Tonnen am nächsten Freitag abgeholt werden. Aber gerade das ist vermutlich regional sehr verschieden. Hier bei uns ist das so, dass Altpapier und Gelber Sack jede Woche (Freitags) abgeholt werden, Restmüll alle 14 Tage und die O-Tonne alle 4 Wochen. Ich habe die Termine aber konfigurierbar gemacht (Konfigurationsfenster). Da kann man einstellen, wann die Tonne das letzte Mal abgeholt wurde und dann ob alle 1, 2 oder 4 Wochen.

    Feiertage:

    Wenn der heutige Tag auf einen Feiertag fällt, dann wird der entsprechende Feiertag oberhalb der Uhrzeit angezeigt. Außerdem sind die Feiertage im Kalender fett geschrieben und werden als Tooltip angezeigt.

    Sonnenaufgang und -untergang:

    Diese sind abhängig vom Ort, wo man sich gerade aufhält (Latitude und Longitude). Dafür habe ich eine Datenbank (Geonames) gefunden, in der die Postleitzahlen und die dazugehörigen Positionen abgespeichert sind. Man muss also im Konfigurationsfenster nur die eigene PLZ eintragen und das Programm sucht die dazugehörigen Positionen aus der Datenbank raus. Zur Überprüfung der Daten kann man sie sich bei OpenStreetMap anzeigen lassen (Lupen-Button neben den Positionen).

    Die besonderen Tage (Geburts-, Hochzeits- und Jahrestage):

    Dabei handelt es sich um Tage, die jedes Jahr wieder eine Bedeutung haben. Sie können im Konfigurationsfenster eingegeben/geändert/gelöscht werden. Sie sind dann im Kalender fett geschrieben und werden als Tooltip angezeigt (wobei die Anzahl der Jahre in Klammern dahinter steht).

    Alarmtöne:

    Im Konfigurationsfenster lasssen sich die MP3-Dateien für die beiden Alarmzeiten festlegen. Sind dort keine MP3s eingetragen, so wird ein interner Alarmton benutzt.

    Tray-Icon:

    Zentraler Anlaufpunkt ist das Icon der Digitaluhr im Tray-Bereich. Hier kann man das oben erwähnte Konfigurationsfenster aufrufen, das Programm in den Autostart packen, das Fenster nach vorne holen, die Programminformationen aufrufen und das Programm beenden.

    Alarmzeiten:

    Die beiden Alarmzeiten lassen sich einstellen, indem man links neben der Uhrzeit auf eine der beiden Uhrensymbole klickt. Es wird dann statt der Uhrzeit die jeweilige Alarmzeit angezeigt und nun kann man mit dem Mausrad die Stunden, Minuten oder Sekunden verstellen (je nachdem, worüber sich der Mauszeiger gerade befindet).

    Links neben den Uhrensymbolen befindet sich noch jeweils eine Checkbox. Wenn die Checkbox angehakt ist, dann ist die entsprechende Alarmzeit aktiv.

    Wenn eine der beiden Alarmzeiten erreicht wurde (und der Alarm aktiv ist), wird der dazugehörige Alarmton (MP3-Datei) abgespielt und es wird ein Alarmfenster (im Vordergrund) angezeigt.

    Der Alarmton wird nur einmal abgespielt (keine Wiederholung) und er kann abgestellt werden, indem man das Alarmfenster schließt. Spätestens nach 10 Minuten wird das Alarmfenster aber auch automatisch geschlossen.

    Countdown:

    Das Datum und die Uhrzeit für den "Countdown bis zum nächsten Urlaub" kann man mit einem Klick auf das Kalendersymbol (mit dem Fragezeichen) einstellen. Wählt man einen Tag vor dem heutigen Datum, so wird kein Countdown angezeigt.

    Lizenz:

    Das Programm steht unter der "CC BY-NC-ND 4.0" Lizenz

    - freie Weitergabe mit Namensnennung

    - nicht kommerziell

    - keine Bearbeitung

    https://creativecommons.org/licenses/by-nc-nd/4.0

    Screenshots:

    Digitaluhr_Screenshot1.pngDigitaluhr_Screenshot2.png

    Digitaluhr_Screenshot3.png

    Zusätzliche Hinweise:

    Im ZIP-Archiv (Anhang) befindet sich das Script und alle benötigten Includes. Die verwendeten Grafiken, Sounds und Fonts sind alle BASE64-codiert in "Ressource.au3" enthalten. Das heißt, eigentlich braucht man dann nur noch die Exe-Datei.

    Die ganzen Einstellungen und Daten (Geburtstage etc.) werden in einem Unterordner von @AppDataDir gespeichert.

    Danksagungen gibt es im Programminformationsfenster. An dieser Stelle aber ein zusätzliches Dankeschön an UEZ ("Base64 String"-Generator) und an BugFix (Feiertagsfunktion) hier aus dem Forum.

    Update v4.1 (18.06.2018):

    Ich habe vergessen die Wecker-Grafik als BASE64-String in Ressoure.au3 zu packen und im Programm war noch der Link auf den Gfx-Ordner eingetragen (der in der veröffentlichten Version gar nicht existiert).

    Bei der Gelegenheit habe ich dann noch das "WNr." gegen "KW" ausgetauscht. :)

    Update v4.2 (20.06.2018):

    - Ein kleiner Bug hatte sich in der Konfiguration eingeschlichen. Die neuen Daten wurden zwar gespeichert, aber die Anzeige im Kalender nicht aktualisiert. Behoben!

    - Die Alarmzeiten lassen sich nun auch mit den Cursortasten einstellen: <links> und <rechts> zum auswählen von Stunden, Minuten, Sekunden und <oben> und <unten> zum verändern der Werte. Der gerade aktive Wert ist grün unterstrichen. Danke autoBert!

    - Die Tooltips zum einstellen der Alarmzeiten ergänzt. Danke autoBert!

    - Es gibt jetzt einen Update-Button im Programminformationsfenster. Beim ersten Klick darauf, wird im Internet nachgesehen, ob es eine neue Version gibt. Wenn ja, muss man das eigentliche updaten nochmal bestätigen (kein Auto-Update!).

    Noch ein Hinweis zum Update:

    Das Update ist nur im kompilierten Zustand möglich! Das heißt, es wird auch nur die kompilierte Exe gegen die neue Exe ausgetauscht! Das evtl vorhandene Script und die Includes bleiben die alten. Wer immer das neueste Script haben will, muss sich das hier im Forum holen.

    Die Exe-Datei wird von meiner Homepage (technik-hobby.de) per HTTPS geladen und dann gegen die vorhandene Exe ausgetauscht. Der Austausch geschieht mit Hilfe einer temporär erstellten Batchdatei. Es ist also wichtig, dass das Programm Schreibrechte im Programmverzeichnis (@ScritpDir) hat.

    Eine "Installation" der Digitaluhr im Programme-Verzeichnis von Windows ist nicht zu empfehlen, weil man dann Administratorrechte für das Update bräuchte. Das halte ich für überflüssig.

    Update v4.2.1 (20.06.2018):

    - Den Bug mit "_WinAPI_GetVersion()" beseitigt. Danke Bitnugger!

    Update 4.3 (25.06.2018):

    - Die Updatefunktion hat nun einen TimeOut dazubekommen. Sollte der Download der neuen Version (aus welchen Gründen auch immer) länger als 60 Sekunden dauern, so wird das entsprechend angezeigt.

    - Die Progressbar befindet sich nun am unteren Rand vom Programminformationsfenster (kein ProgressOn/-Off mehr).

    - Ich habe das komplette Script jetzt umfangreich kommentiert, für den Fall dass jemand irgendeine Funktion des Scripts gebrauchen kann.

    - Beim kommentieren sind mir dann noch Code-Optimierungen aufgefallen, die ich gleich eingebaut habe. Somit hat sich am Script so einiges geändert. Am Aussehen aber nicht. :)

    Update 4.3.1 (25.06.2018):

    - Das Update war nur für einen internen Test.

    Update 4.3.2 (26.06.2018):

    - Ein Bug beim Update, wenn das Programm aus dem Autostart gestartet wurde. Dann stimmte das WorkingDir nicht mit dem ScriptDir überein und verursachte einen Fehler. Behoben!

    Dateien

    Digitaluhr_v4_3_2.zip 3,11 MB – 700 Downloads
  • Script Paused? Warum?

    • Oscar
    • 16. Juni 2018 um 08:39
    Zitat von Schleifchen

    Ich brauch nur noch eine Lösung für das OneDrive-Icon im Tray, welches nicht beendet wird.

    Das ist ja auch kein Wunder, dass das Tray-Icon überbleibt. Benutzte statt ProcessClose lieber WinClose.

  • Pixelsearch / alternative für Bilder

    • Oscar
    • 13. Juni 2018 um 17:58

    Was hast Du denn vor?

    Du erzählst uns nur, wie Du an das Problem herangehst, aber nicht worin das Problem eigentlich besteht.

    In 99.99% aller Fälle ist PixelSearch jedenfalls nicht die Lösung, sondern eher das Problem. ;)

  • USB Fan per script aus-an schalten

    • Oscar
    • 13. Juni 2018 um 05:15

    Ohne Zusatzhardware wohl eher nicht möglich.

    Mit Arduino und Transistor schon.

  • RegEx: Linie nach bestimmter Linie

    • Oscar
    • 11. Juni 2018 um 08:17
    Zitat von Sonderbaar

    Oscar Regex-Gott

    Nein! Das denke ich nicht.

    Als ich mit AutoIt anfing, waren RegExp-Pattern für mich auch ein Buch mit sieben Siegeln.

    Mit der Zeit eignet man sich einige Erfahrungen an, die mit RegExp zum gewünschten Erfolg führen.

    Zu den Erfahrungen gehört aber auch, dass man die "Extremwerte" bei dem String kennen muss, um ein 100%-Pattern hinzubekommen.

    Deswegen ist es wichtig, die Ausgangsdaten ganz genau zu analysieren. Bei dem obigen Pattern, muss beispielsweise immer ein Eintrag vorhanden sein. Ein Leerstring anstelle der Daten würde zum Fehlschlag führen.

    Wenn man mit RegExp arbeiten will, dann muss man alle Eventualitäten mit einkalkulieren, sonst führt das oft zu merkwürdigen Fehlern im Programm.

  • RegEx: Linie nach bestimmter Linie

    • Oscar
    • 10. Juni 2018 um 15:54

    So:

    AutoIt
    Local $sText = "Personalien / Kontaktdaten des Kandidaten" & @CRLF & "Name / Vorname" & @CRLF & "MUSTER HANS PETER" & @CRLF & "Staatsangehörigkeit" & @CRLF & "CH" & @CRLF & "Adresse" & @CRLF & "Musterstr. 9, 8001 Zürich" & @CRLF & "Mobiltelefon" & @CRLF & "+41 79 999 99 99" & @CRLF
    
    Local $sName = StringRegExpReplace($sText, '(?s).+Name / Vorname\v+(.+?)\v.*', '$1')
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $sName = "' & $sName & '"' & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    Local $sStaatsangehoerigkeit = StringRegExpReplace($sText, '(?s).+Staatsangehörigkeit\v+(.+?)\v.*', '$1')
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $sStaatsangehoerigkeit = "' & $sStaatsangehoerigkeit & '"' & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    Local $sAdresse = StringRegExpReplace($sText, '(?s).+Adresse\v+(.+?)\v.*', '$1')
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $sAdresse = "' & $sAdresse & '"' & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    Local $sMobil = StringRegExpReplace($sText, '(?s).+Mobiltelefon\v+(.+?)\v.*', '$1')
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $sMobil = "' & $sMobil & '"' & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
  • GuiSetIconEx

    • Oscar
    • 10. Juni 2018 um 15:31

    Wenn man den "'File to Base64 String' Code Generator" von UEZ benutzt, um Grafiken in das Script einzubetten, dann fällt einem schnell auf, dass man das Fenster-Icon nicht so einfach ändern kann.

    Mit GuiSetIcon geht es nicht! Es gibt aber eine WinApi-Funktion "_WinAPI_SetClassLongEx", mit der man die Icons (in der Taskleiste und oben/links im Fenster) ändern kann.

    Dazu muss man aber die Binaerdaten der PNGs vorher in HICONs umwandeln, damit Windows damit klar kommt. Hier habe ich mal ein Beispiel dafür geschrieben:

    AutoIt
    #include <APISysConstants.au3>
    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include <WinAPI.au3>
    #include <WinAPISys.au3>
    
    _GDIPlus_Startup()
    
    Global $adLanguage[2] = [_englishpng(), _germanpng()] ; Binaerdaten der PNGs laden
    Global $ahIconLang[2]
    For $i = 0 To 1
        $ahIconLang[$i] = _CreateHIconFromBinary($adLanguage[$i]) ; die Binaerdaten in ein HIcon umwandeln
    Next
    Global $hGui = GUICreate('Testfenster', 400, 300) ; normales Fenster mit AutoIt-Icon als Fenster-Icon
    GUISetState()
    
    MsgBox(0, 'MsgBox', StringFormat('Noch ist das AutoIt-Icon zu sehen.\r\nNach dem schließen der MsgBox wird auf das\r\nIcon aus dem Speicher umgeschaltet.'))
    _WinAPI_SetClassLongEx($hGui, $GCL_HICON, $ahIconLang[0]) ; das Icon in der Taskleiste ersetzen
    _WinAPI_SetClassLongEx($hGui, $GCL_HICONSM, $ahIconLang[0]) ; das Icon oben/links im Fenster ersetzen
    
    MsgBox(0, 'MsgBox', StringFormat('Und jetzt das Icon auf das zweite HIcon umschalten.'))
    _WinAPI_SetClassLongEx($hGui, $GCL_HICON, $ahIconLang[1]) ; das Icon in der Taskleiste ersetzen
    _WinAPI_SetClassLongEx($hGui, $GCL_HICONSM, $ahIconLang[1]) ; das Icon oben/links im Fenster ersetzen
    
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    ; Achtung! Aufraeumen nicht vergessen!
    For $hIcon In $ahIconLang
        _WinAPI_DeleteObject($hIcon) ; die HIcons wieder aus dem Speicher entfernen
    Next
    _GDIPlus_Shutdown()
    Exit
    
    Func _CreateHIconFromBinary($dBinary, $iSize = 32)
        Local $hBitmap, $hResize, $hIcon
        $hBitmap = _GDIPlus_BitmapCreateFromMemory($dBinary)
        $hResize = _GDIPlus_ImageResize($hBitmap, $iSize, $iSize)
        $hIcon = _GDIPlus_HICONCreateFromBitmap($hResize)
        _GDIPlus_BitmapDispose($hResize)
        _GDIPlus_BitmapDispose($hBitmap)
        Return $hIcon
    EndFunc   ;==>_CreateHIconFromBinary
    
    ;Code below was generated by: 'File to Base64 String' Code Generator v1.20 Build 2015-09-19
    
    Func _englishpng($bSaveBinary = False, $sSavePath = @ScriptDir)
        Local $englishpng
        $englishpng &= 'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAADCElEQVR42u2Wa0hTYRzGn2M40+ksU1xSSGQqK61peEWlLAsjaIWkpTk1rJZSWHr2ofJS5MJLZSiWJooKFmh+0KAyC6dogxQUJi3t8iGV1sV0zssiO+ek5bx1BsH6sOfT+3LeP8/vnP/7fzgEjCzCBGACMAEYHaDQOyQqJi870TrYD9PTQG5pK64Wt+Db6OSSRQUXw3HwTSvUheXM3uFULOpdg5GU2bhkja2NBdLEvkjgDGLoynVwfb3QE7TtDlESk0gGKN/LzB0dwE+TgAYZHpnAjfJ23KxoXxTk1qV9EPXJoS6aAZCI8cAlCMlZjYsaJ0d645j5IKbKq2DhsgH8VMrHzwsNDQ+lBG9TDHlCHCmLt/mMHxXVYAPCBmA5Y/WXMepLt+F2WY2UAD+ChLW7jGtpDglVwAZkOQA2xoXVCoxpp4Cxvj8As+RsQFyc7bCzq0kPoFm4CyrVEDvjWdEAJ1NyyK3bQ2Tze2dtyYEo1BW65hZ8/zoMro8QlgLX388/pOfqATilp2CkSQ7dwBBzjj5PSzuuQ91jJTRzjWek7G6XEqWHosm9bpsXAPxNmo5OjHcrmbWlp4B5U0P1rP+VlMi3WU/usOAZDPAv1DY1+h8A3D0ST+5132J4C+QKaLt6mLWV0APWQT4GAzzvo1oQl5RNenovvIT0OB0O94AVNRXTVERqWhWYUKrAcV4HXlgIBjLz9S9hxjkQxK9kH6fOaeQvsGK1LSz2hOJ+k4oa34kFAL30JZw/hrTxmVh/nBX7YxVvJTQtHRjKKYJu8CPMxNEoG10Dgdta7O5+qgfwxDMUvf1qnD8eCAc7LnNJ6brJ12/BiTuKSp0TCmpe6ifr3BxgY1x0r5OZ4+WCiM6R09G+7EBoAHuBmJQkxsjYGM+KTRSzASmurJUStbV1pEh0QMbG2BAANiCdnhupIMq4HCFU9MZrO3vgSCahSsdHXoViUeNZXUsLw/53HfhUUs3s7ROi0OgSiFTZoyVruFYcpMQHMC02MyMYkPoLWWXG/yExAZgATADGBvgJP/jk1FfufMIAAAAASUVORK5CYII='
        Local $bString = _WinAPI_Base64Decode($englishpng)
        If @error Then Return SetError(1, 0, 0)
        $bString = Binary($bString)
        If $bSaveBinary Then
            Local Const $hFile = FileOpen($sSavePath & "\english.png", 18)
            If @error Then Return SetError(2, 0, $bString)
            FileWrite($hFile, $bString)
            FileClose($hFile)
        EndIf
        Return $bString
    EndFunc   ;==>_englishpng
    
    Func _germanpng($bSaveBinary = False, $sSavePath = @ScriptDir)
        Local $germanpng
        $germanpng &= 'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAlElEQVR42mNkGGDAOOqAUQcMBgcoArHaANl/C+SAciDuGCAHVIw6YNQBjPxAB7AOkAP+gBwwDegA9wFywAGQA6YDHeA2QA44OOqAQeGAGYwM5a7/B8YBhxiBDlhTz1Dubz0wDth5GuiA9b0M5QGOA+OAHcdGHTDqAKADwt0YFDUUB6ZJducxpEk2oGDUAaMOGHAHAABpjj7bxlq0/AAAAABJRU5ErkJggg=='
        Local $bString = _WinAPI_Base64Decode($germanpng)
        If @error Then Return SetError(1, 0, 0)
        $bString = Binary($bString)
        If $bSaveBinary Then
            Local Const $hFile = FileOpen($sSavePath & "\german.png", 18)
            If @error Then Return SetError(2, 0, $bString)
            FileWrite($hFile, $bString)
            FileClose($hFile)
        EndIf
        Return $bString
    EndFunc   ;==>_germanpng
    
    Func _WinAPI_Base64Decode($sB64String)
        Local $aCrypt = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "ptr", 0, "dword*", 0, "ptr", 0, "ptr", 0)
        If @error Or Not $aCrypt[0] Then Return SetError(1, 0, "")
        Local $bBuffer = DllStructCreate("byte[" & $aCrypt[5] & "]")
        $aCrypt = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "struct*", $bBuffer, "dword*", $aCrypt[5], "ptr", 0, "ptr", 0)
        If @error Or Not $aCrypt[0] Then Return SetError(2, 0, "")
        Return DllStructGetData($bBuffer, 1)
    EndFunc   ;==>_WinAPI_Base64Decode
    Alles anzeigen
  • Verständnisfrage zu "Local vs Global" in Bezug auf Geschwindigkeit und Ressourcenbelegung

    • Oscar
    • 31. Mai 2018 um 08:17

    Statt des Dictionarys könnte man auch Arrays nehmen und die Indizes mit Variablen (Enum) benennen:

    AutoIt
    Global $aIcons[3] = [_Icon1(), _Icon2(), _Icon3()]
    Global Enum $live, $lock, $program
    ConsoleWrite($aIcons[$live] & @CR)
    ConsoleWrite($aIcons[$lock] & @CR)
    ConsoleWrite($aIcons[$program] & @CR)
    
    Func _Icon1()
        Local $icon = 'AAABAA...'
        Return $icon
    EndFunc
    
    Func _Icon2()
        Local $icon = 'FFCCAB...'
        Return $icon
    EndFunc
    
    Func _Icon3()
        Local $icon = 'DDCCBB...'
        Return $icon
    EndFunc
    Alles anzeigen
  • Verständnisfrage zu "Local vs Global" in Bezug auf Geschwindigkeit und Ressourcenbelegung

    • Oscar
    • 31. Mai 2018 um 07:53

    Du machst einen gravierenden Fehler!

    Mit _GDIPlus_BitmapCreateFromMemory erstellst Du bei jedem Aufruf eine neue Bitmap. Diese werden aber beim verlassen der Funktion nicht wieder freigegeben. Das führt zu einem Speicherleck.

    Besser einmal (global) die Icons erstellen und dann diese nutzen und bei Programmende wieder freigeben.

    Das behebt nicht nur das Speicherleck, sondern ist auch schneller.

  • MsgBox - Text zentriert ausgeben?

    • Oscar
    • 15. Mai 2018 um 16:08

    Die Standard-MsgBox regelt die Breite des Fensters automatisch anhand des anzuzeigenden Strings. Zentrierter Text wurde dabei nicht vorgesehen.

    Mir ist auch keine Möglichkeit bekannt, wie man das umgehen könnte.

    Alternativ erstellst Du Dir eine eigene MsgBox (GuiCreate, GuiCtrlCreateLabel, etc.) und benutzt bei dem Label dann $SS_CENTER als Style. So hättest Du dann einen zentrierten Text.

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™