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

Beiträge von Kanashius

  • Window Looper

    • Kanashius
    • 1. März 2026 um 16:23
    Zitat von RSBox

    da er die ini-datei nicht annimmt

    1. Prüfen, ob der Pfad stimmt. Ist die Datei im richtigen (selben) Ordner und hat den richtigen Name (sollte der Fall sein, wenn sie vom Programm selbst erstellt wird.
    2. Ist die Struktur der Datei richtig? Du könntest mit den Ini-Read Befehlen selbst mal versuchen die Daten einzulesen.
    3. Wie sind die Berechtigungen des Programmes beim starten? Startest du ggf. als Administrator, wenn du die .ini-Datei erstellen lässt und als User zum auslesen,... (e.g. Lese-Berechtigung des Programmes)
    4. Funkt dein Virenprogramm dazwischen (warum/wobei auch immer)

    wären so meine ersten Ideen/Anhaltspunkte.

  • Window Looper

    • Kanashius
    • 28. Februar 2026 um 17:37

    Es gibt 2 Möglichkeiten:
    1. Die Fenster-Hinzufügen (window adding) Modus aktivieren, dann kannst du das Fenster auswählen und mit ENTER zur rotation hinzufügen.
    2. In den Einstellungen (Settings) bei der "Filter configuration" auf das + drücken und in der Liste das neu erstellte Item doppelklicken. Du kannst dort dann nach Prozessname, Prozesspfad, Fenster title und der Sichtbarkeit des Fensters filtern. Prozessname und Pfad muss exakt übereinstimmen, beim Titel muss es nur enthalten sein. Wenn du in dem Fenster dann "apply" drückst wird es angewendet. Wenn du "save for restart" anklickst, wird es auch angewendet und zusätzlich in eine .ini Datei gespeichert, sodass die Filter beim nächsten neustart des Programmes geladen werden können. Das "loop interval" ist die pause zwischen den Fenstern der Rotation.

    Der "reload from filters"-Button wendet die konfigurierten Filter neu an (falls neue Fenster geöffnet wurden, die auf den Filter passen, werden die hinzugefügt). Das entfernen von Fenstern passiert automatisch, wenn sie geschlossen wurden und das nächste mal dran wären.

    Wenn du dir die Bilder in meinem Post (im spoiler) anschaust sind die Buttons entsprechend beschriftet, falls die Symbole nicht eindeutig genug sind.

    "Apps", also Programme hinzuzufügen ist aktuell nicht möglich. Das Programm schaut nur nach existierenden Fenstern, es startet keine Programme.

  • Window Looper

    • Kanashius
    • 24. Februar 2026 um 11:18
    Zitat von Moombas

    Im Prinzip ist das ja was für einen Kiosk Bildschirm

    Jo, fehlt nur noch das automatische Starten der Programme/Öffnen der Fenster beim hochfahren :D

  • 2 Apps abwechselnd anzeigen lassen

    • Kanashius
    • 23. Februar 2026 um 23:59

    Wenn du aus dem Thread die Zip-Datei mit dem Quellcode heruntergeladen hast sind dort 2 Dateien drin. Die WinLooper.au3 und die ListViewEditInput.au3. Beide müssen in dem selben Ordner bleiben. Die Fehlermeldung besagt, dass er die Datei nicht finden konnte, oder dass er die nicht öffnen konnte. Ist die vllt. auch in Quarantäne geschickt worden oder hat falsche Berechtigungen oder sowas?

    Da das Programm und die UDF beide von mir kommen, bin ich recht sicher, dass sie keine Gefahr darstellen ;)
    Deshalb hab ich aber nicht nur die .exe sondern auch den Quellcode hochgeladen. Wer möchte kann den durchschauen und selbst sichergehen :)

    Das AutoIt-Programme gerne fälschlicherweise von Virenprogrammen erkannt werden ist leider ein bekanntes Problem, das schon öfter im Forum diskutiert wurde... man kann nicht wirklich was machen.

    LG Kanashius

  • 2 Apps abwechselnd anzeigen lassen

    • Kanashius
    • 21. Februar 2026 um 01:37

    Ich fand das Problem interessant und hab mal ein Programm dafür geschrieben. Das sollte umsetzen, was du möchtest:

    Thema

    Window Looper

    Dieses Script kann verwendet werden, um verschiedene Fenster mit dem Processnamen, Processpfad, Windowtitle und visibility auszuwählen und abwechselnd ein/aus zu blenden.

    Processname und Processpfad müssen identisch sein, der Fenstertitel muss nur in dem richtigen Titel enthalten sein. Mehrere Bedingungen können auch kombiniert werden.

    Außerdem ist es möglich, einen Modus zu aktivieren, in dem mit "ENTER" das jeweils aktive Fenster hinzugefügt werden kann.

    Das Interval, wie lange das jeweilige…
    Kanashius
    21. Februar 2026 um 01:30

    Das Programm kann Fenster automatisch erkennen (Nach Prozessname, Prozesspfad, Fenstertitel und Sichtbarkeit des Fensters). Außerdem können Fenster manuell hinzugefügt werden (Das hinzufügen im Programm aktivieren, dann das Fenster auswählen und ENTER drücken. ENTER ist in dem Modus natürlich blockiert, bis der Modus beendet wird).

    Die Fenster werden dann nacheinander durchgegangen (Reihenfolge kann geändert werden) und angezeigt. Sie werden dabei nicht "aktiviert". Das heißt, man kann den PC nebenbei ganz normal verwenden. Wenn andere Fenster vor die ein/ausblendenden Fenster geschoben werden, bleiben sie auch dahinter.

    Ich hoffe, das ist es was du gesucht hast, ansonsten kannst du dir im Quellcode in Zeile 346 die Funktion _winHandle ansehen, dort kann geändert werden, was passiert, wenn ein Fenster "aktiviert" wird.

    Viel Spaß damit :)

  • Window Looper

    • Kanashius
    • 21. Februar 2026 um 01:30

    Dieses Script kann verwendet werden, um verschiedene Fenster mit dem Processnamen, Processpfad, Windowtitle und visibility auszuwählen und abwechselnd ein/aus zu blenden.

    Processname und Processpfad müssen identisch sein, der Fenstertitel muss nur in dem richtigen Titel enthalten sein. Mehrere Bedingungen können auch kombiniert werden.

    Außerdem ist es möglich, einen Modus zu aktivieren, in dem mit "ENTER" das jeweils aktive Fenster hinzugefügt werden kann.

    Das Interval, wie lange das jeweilige Fenster angezeigt werden kann, kann auch jederzeit geändert werden. Standard sind 5000ms (5 Sekunden).

    Wenn das Programm gestartet wird ist erst nichts zu sehen, alle Einstellungsmöglichkeiten finden sich im TrayMenü (unten rechts in der Taskleiste, siehe Bilder).

    Bilder zur Übersicht:

    Spoiler anzeigen

    Button erklärung:

    Tray Menü:

    Viel Spaß mit dem Programm :)

    LG Kanashius

    Dateien

    WinLooper.au3 24,26 kB – 72 Downloads WinLooper-Src.zip 10,73 kB – 82 Downloads
  • 2 Apps abwechselnd anzeigen lassen

    • Kanashius
    • 17. Februar 2026 um 18:06

    Ohne den Rest des Programmes (in dem auch dein Problem ist) kann man nur schwer helfen, aber eine Frage kann ich dir Beantworten:

    $killSwitch is kein Befehl/Funktion sondern eine Variable. In diesem Fall ein bool, also ein Wahr (True) oder Falsch (False).

    While _Timer_GetTimer($timer) > 0 And Not $killSwitch besagt also, dass die Schleife weiterlaufen soll, wenn _Timer_GetTimer($timer)>0 ist und $killSwitch nicht True ist.

    In dem bisherigen Code wird $killSwitch nie vom initialen "False" auf True geändert. Wenn die Schleife verlassen wird, dann nur weil _Timer_GetTimer($timer)>0 irgendwann nicht mehr zutrifft.

    Vielleicht hilft dir das ja weiter.

  • Community Projekt: Teil 1 - Interesse an einem gemeinsamen größeren (Software)Projekt?

    • Kanashius
    • 2. Februar 2026 um 11:46
    Zitat von Schnuffel

    Ich hätte gedacht erstmal einen groben Workflow der Patch Geschichte zu entwerfen. Wenn sich daraus Teile als „könnte man umsetzen“ erweisen, kann man das ganze Herüst in GIT anlegen und freiwillige Unterstützer suchen, die php, html können um den Webcrawler zu designen. Andere würden die Client-Serverstruktur in AutoIt basteln.

    Konzeptuell würde ich den crawler wahrscheinlich in Python schreiben. Ich hab das schonmal gemacht und dort kann man nicht nur den Quellcode holen, sondern auch recht einfach mit Selenium den browser automatisieren, jenachdem, wie komplex die Webseite des Softwareanbieters ist.

    Python kann auch Objektorientiert arbeiten und da RegEx (wie du es in der Datenbank aktuell verwendest) recht fehleranfällig (gerade bei kleineren Änderungen) ist bräuchte man für die Zuverlässigkeit doch eher etwas komplexeres vmtl. mit XPath,...
    Zumindest ist es das, womit ich dabei gearbeitet habe. Es kann dann für jede Webseite eine Klasse(/Objekt) erstellt werden, die generellere Helferklassen erweitert und sich dann nurnoch um die Details kümmert.

    Außerdem wäre es relativ einfach eine kleine API sowie den Datenbankzugriff zu implementieren.

    Es wäre zumindest auch eine Scriptsprache und es lässt sich auch gut erweitern. Man könnte das Grundgerüst bauen und muss dann nurnoch für jede Software eine Python-Script-Datei mit der Klasse für diese Software in eine Art "Extension" Folder geben, die dann automatisch geladen und ausgeführt werden.

    Code
    +---main.py
    +---api.py
    +---database.py
    +---scheduler.py
    +---parser.py	=> helper for simple parsing with sourcecode/regexp/xpath
    +---browser.py	=> helper for more complex websites using a browser
    +--- ... whatever else is needed
    +-+-software-extensions	=> dynamically loaded as extensions
      +---7-zip.py
      +---notepadpp.py
      +---pdf24creator.py
      +---...
    Alles anzeigen

    Und die Datenbank würde ich so generisch wie möglich aufbauen. Mit den Daten aus deiner Tabelle als Beispiel:

    Code
    Table Software
    ID|Name|LastUpdate|LastCheck|DownloadLink
    (DownloadLink is to the generell download website)
    
    Table Versioning
    SoftwareID|ID|Major|Minor|Patch|Revision|Type|ReleaseDate|FoundAt
    (FoundAt to know, when the release was first seen)
    (May need to be adapted to different version schemas, maybe even with different Tables, if they are completely incompatible)
    
    Table Downloads
    SoftwareID|VersionID|DownloadLink|DirectDownloadLink
    (download link to specific versions, DirectDownloadLink to the specific file if possible)
    
    
    Version-Examples:
    1.2.0-a.1	1.2.0.1		1.1.90 => Major: 1, Minor: 2, Patch: 0, Revision: 1, Type: a (alpha)
    1.2.0-b.2	1.2.1.2		1.1.93 => Major: 1, Minor: 2, Patch: 1, Revision: 2, Type: b (beta)
    1.2.0-rc.3	1.2.2.3		1.1.97 => Major: 1, Minor: 2, Patch: 2, Revision: 3, Type: rc (release candidate)
    Alles anzeigen

    Ich würde sagen die Spalten Url-Version, Url-Date, RegExVersion, RegExDate aus deiner Tabelle gehören gar nicht in die Datenbank, sondern in die Software-Extension für die Implementierung.

    Bei dem system würde die main.py die API starten und auch eine Art scheduler, die dafür sorgt, dass die websites immer wieder gecrawled werden und die Änderungen in die Datenbank übernommen werden.
    Dabei wird das ganze so designed, dass die Software-Extensions auch mit Fehlern crashen dürfen, das aber abgefangen wird, sodass der rest weiterläuft.
    Die Extensions würden dabei auch nicht direkt auf die Datenbank zugreifen, sondern einfach nur crawlen und Funktionen haben um die gefundenen Daten abzuholen (durch implementieren eines Interfaces/...).
    Das wäre dann für jede Extension gleich und kann vom Scheduler übernommen werden.

    So, das wären meine 2-Cents ;)

  • Progress einfärben in Win10

    • Kanashius
    • 27. Januar 2026 um 00:05

    Frag mich nicht warum, aber scheinbar muss man erst das Window-Theme ausschalten... ( https://stackoverflow.com/questions/1652…ress-bar-win-32 )

    Hiermit klappt es bei mir:

    AutoIt
    #include <WinAPITheme.au3>
    
    Local $hGui = GUICreate("", 800, 600)
    Local $idProgress = GUICtrlCreateProgress(10, 10, 780, 30)
    GUICtrlSetData($idProgress, 50)
    _WinAPI_SetWindowTheme(GUICtrlGetHandle($idProgress), "", "")
    GUICtrlSetColor($idProgress, 0xFF0000)
    GUICtrlSetBkColor($idProgress, 0x00FF00)
    GUISetState()
    
    While True
    	If GUIGetMsg()=-3 Then Exit
    WEnd
    Alles anzeigen

    LG Kanashius

    PS: Ich hab nach "winapi progress set color" gesucht. Oft findet man gute Ergebnisse (für andere Programmiersprachen) für die Windows API.

  • Symbol im Kontextmenü

    • Kanashius
    • 23. Januar 2026 um 17:13

    Hallo BigRox,

    dein erster Fehler ist, dass du _GDIPlus_StartUp (und _GDIPlus_Shutdown) nicht aufgerufen hast. Wenn etwas nicht funktioniert, schau dir am besten mal die Beispiele zu den Funktionen an.

    Dann gibt es dort eine besonderheit, dass _GUICtrlMenu_SetItemBmp eine HBITMAP haben möchte und keine normale Bitmap. Also vorher nocheinmal umandeln.
    Das ganze sieht dann so aus:

    AutoIt
    #include <GuiMenu.au3>
    #include <WinAPIGdi.au3>
    #include <GDIPlus.au3>
    
    Global $hGUI = GUICreate("Example", 400, 300)
    Global $idMenu = GUICtrlCreateContextMenu()
    Global $idMenuItemText = GUICtrlCreateMenuItem("Example", $idMenu)
    GUISetState(@SW_SHOW)
    
    _GDIPlus_Startup()
    Local $hBitmap = _GDIPlus_BitmapCreateFromFile("ArrowDrag.png")
    Local $hBitmapResized = _GDIPlus_ImageResize($hBitmap, 20, 20)
    _GUICtrlMenu_SetItemBmp(GUICtrlGetHandle($idMenu), 0, _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmapResized))
    _GDIPlus_BitmapDispose($hBitmapResized)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_Shutdown()
    
    Do
    Until GUIGetMsg() = -3
    Alles anzeigen

    Ich hab auch gleich ein resize mit eingebaut, da ich vermute, das wirst du auch benutzen wollen ;)

    Ich hoffe das hilft dir weiter, Kanashius :)

  • Symbol im Kontextmenü

    • Kanashius
    • 21. Januar 2026 um 17:55

    Wenn es ein eigenes Bild sein soll:

    AutoIt
    #include <GuiMenu.au3>
    #include <WinAPIGdi.au3>
    
    Global $hGUI = GUICreate("Example", 400, 300)
    Global $idMenu = GUICtrlCreateContextMenu()
    Global $idMenuItemText = GUICtrlCreateMenuItem("Example", $idMenu)
    GUISetState(@SW_SHOW)
    
    _GUICtrlMenu_SetItemBmp(GUICtrlGetHandle($idMenu), 0, _WinAPI_CreateSolidBitmap($hGUI, 0xFF0000, 11, 11))
    Do
    Until GUIGetMsg() = -3
    Alles anzeigen

    Du kannst bei der Bitmap statt _WinAPI_CreateSolidBitmap eine beliebige Bitmap z.B. mit _GDIPlus_... nutzen.

    Ich hoffe das hilft dir weiter :)

  • ColorChangeIconButton - BugWorkaround?

    • Kanashius
    • 4. Dezember 2025 um 02:23

    Hi, ja, ohne WinAPi/GDI+ wird es schwierig. Ich denke, dein Workaround im ersten Beispiel funktionierte schon recht gut. Da hatte ich auf die schnelle auch keine bessere Lösung gesehen.

    Da du dir die Mühe mit dem weiteren Bespiel gemacht hast gehe ich mal davon aus, dass du eine andere/bessere Lösung möchtest.
    Ich hab also mal gebastelt und eine recht elegante Lösung gefunden, denke ich. Ich verpacke das ganze in eine eigene GuiCtrlCreateIconEx -Funktion. Intern wird dabei ein GuiCtrlCreateGraphic verwendet, bei dem die Pixel entsprechend gesetzt werden.
    Ich denke die Performance könnte noch verbessert werden (z.B. GDIPlus global laden/entladen (_GDIPlus_StartUp/Shutdown) oder eine ganz andere Methode zu verwenden mit z.B. GuiCtrlCreatePic).
    Die Verwendung ist aber mit einem Funktionsaufruf recht elegant und es kann danach wie ein normales AutoIt-Ctrl verwendet werden (Es ist halt nur ein GraphicCtrl).

    AutoIt
    #include <GUIConstantsEx.au3>
    #include <GUIConstants.au3>
    #include <GDIPlus.au3>
    #include <WinAPIShellEx.au3>
    #include <WinAPISysWin.au3>
    
    Example()
    
    Func Example()
    	Local $bg_color = 0xf0f0f0
        Global $hGUI = GUICreate("GuiTest", 300, 200)
    
        ; Create a button control. - from examples working perfectly with trans icon on Default Color (No GUISetBkColor!) but has no color!
        Local $idButton_1 = GUICtrlCreateButton("", 30, 30, 48, 48, $BS_ICON)
    	GUICtrlSetTip ( $idButton_1, "DefBtn", "")
    	Local $idIcon_1 = GUICtrlSetImage($idButton_1, "C:\Windows\System32\imageres.dll", -82, 1)
    
    	; The same but with color => not showing .ico file
        Local $idButton_2 = GUICtrlCreateButton("ColBtn", 100, 30, 48, 48, $BS_ICON)
    	GUICtrlSetTip ( $idButton_2, "no ico!", "")
    	GUICtrlSetBkColor($idButton_2, 0x666666)
    	Local $idIcon_2 = GUICtrlSetImage($idButton_2, "C:\Windows\System32\imageres.dll", -82, 1)
    
    	; Createing a color label with the icon as pseudo-button works ONLY if GUI-BG-color is  same as the icons background
        Local $idButton_3 = GUICtrlCreateLabel("", 170, 30, 48, 48)
    	GUICtrlSetTip ( $idButton_3, "bad ico", "")
    	GUICtrlSetBkColor($idButton_3, 0x666666)
    	Local $idIcon_3 = GUICtrlCreateIcon("C:\Windows\System32\imageres.dll", -82, 178,38, 32,32)
    
    	Local $idIcon = GuiCtrlCreateIconEx("C:\Windows\System32\imageres.dll", -82, 30, 80, 48, 48, 32,32)
    	GUICtrlSetBkColor(-1, 0x666666)
    
    	; Press this button to "solve" the problem
        Local $idButton_Switch = GUICtrlCreateButton("See the bug!", 210, 170, 85, 25)
    
        GUISetState(@SW_SHOW, $hGUI)
    
        Local $iPID = 0
    
        ; Loop until the user exits.
        While 1
            Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE
                    ExitLoop
    			Case $idButton_Switch
    				If $bg_color = 0xf0f0f0 Then
    					$bg_color = 0x666666
    					GUISetBkColor($bg_color, $hGUI)
    					$msg = "nice ico"
    				ElseIf $bg_color = 0x666666 Then
    					$bg_color = 0xf0f0f0
    					GUISetBkColor($bg_color, $hGUI)
    					$msg = "bad ico"
    				EndIf
                Case $idButton_1
                    ; Run Notepad with the window maximized.
                    MsgBox(0,"Default Button", "ico is transparent, but surface has fix color!")
                Case $idButton_2
                    ; Run Notepad with the window maximized.
                    MsgBox(0,"Default Button with Color", "Color set with GUICtrlSetBkColor() prevents ico")
                Case $idButton_3
                    ; Run Notepad with the window maximized.
                    MsgBox(0,"Label-Button", "Color will only work with transparency if gui-bg-bol matches the Label!")
                Case $idIcon
                    ; Run Notepad with the window maximized.
                    MsgBox(0,"IconEx-Button", "Works!")
    
            EndSwitch
        WEnd
    
        ; Delete the previous GUI and all controls.
        GUIDelete($hGUI)
    
        ; Close the Notepad process using the PID returned by Run.
        If $iPID Then ProcessClose($iPID)
    EndFunc   ;==>Example
    
    Func GuiCtrlCreateIconEx($sFilename, $iIconIndex, $iLeft, $iTop, $iWidth = Default, $iHeight = Default, $iIconWidth = Default, $iIconHeight = Default, $iStyle = Default)
    	If $iIconWidth = Default Then $iIconWidth = $iWidth
    	If $iIconHeight = Default Then $iIconHeight = $iHeight
    	Local $idGraphic = GUICtrlCreateGraphic($iLeft, $iTop, $iWidth, $iHeight, $iStyle)
    	_GDIPlus_Startup()
    	Local $hIcon = _WinAPI_ShellExtractIcon($sFilename, $iIconIndex, $iIconWidth, $iIconHeight)
        Local $hBitmap = _GDIPlus_BitmapCreateFromHICON($hIcon)
    	Local $iColorPrev = -1, $iImgWidth=_GDIPlus_ImageGetWidth($hBitmap), $iImgHeight = _GDIPlus_ImageGetHeight($hBitmap)
    	Local $iLeftSpace = (_WinAPI_GetClientWidth(GUICtrlGetHandle($idGraphic))-$iImgWidth)/2, $iTopSpace = (_WinAPI_GetClientHeight(GUICtrlGetHandle($idGraphic))-$iImgHeight)/2
    	For $x=0 To $iImgWidth
    		For $y=0 To $iImgHeight
    			Local $iColor = _GDIPlus_BitmapGetPixel($hBitmap, $x, $y)
    			If BitAND($iColor, 0xFF000000)<>0 Then
    				$iColor = BitAND($iColor, 0xFFFFFF)
    				If $iColor<>$iColorPrev Then
    					GUICtrlSetGraphic($idGraphic, $GUI_GR_COLOR, $iColor, $iColor)
    					$iColorPrev = $iColor
    				EndIf
    				GUICtrlSetGraphic($idGraphic, $GUI_GR_PIXEL, $iLeftSpace+$x, $iTopSpace+$y, 40, 30, 270)
    			EndIf
    		Next
    	Next
    	_GDIPlus_BitmapDispose($hBitmap)
    	_GDIPlus_Shutdown()
    	return $idGraphic
    EndFunc
    Alles anzeigen

    Ich hoffe das hilft dir weiter :)

  • PCIe 5 SSD

    • Kanashius
    • 1. November 2025 um 04:18

    Ich kann dabei Atlas OS ( https://atlasos.net/ ) empfehlen.
    Da wird alles unöntige wegreduziert und man kann einstellen was man will (mit Rufus die iso installiert, da kann man auch gleich das erzwingenen des Online-Accounts ausschalten).

    Damit ist es sogar noch besser auszuhalten als mit dem unveränderten Windows 10 :)

    Man sollte aber den PC neu aufsetzen und direkt die installation ausführen, bei einem etablierten System also eher ungünstig.

    => Ich würde Windows nicht mehr anders nutzen

  • MachMichVoll (MP3 zu Stick kopieren bis er voll ist)

    • Kanashius
    • 31. Oktober 2025 um 19:20

    Als Ergänzung:
    @error (und auch @extended) sind nicht nur dafür da, um festzustellen ob ein Fehler aufgetreten, sondern bei vielen Funktionen auch, welcher Fehler.
    Das hilft dann beim programmieren (z.B. bei der Fehlersuche) und kann ggf. auch genutzt werden, um im Code zu entscheiden, wie es bei einem Fehler weitergehen soll.

    Ein Beispiel wäre die StringRegExp -Funktion. Dort steht z.B. in der Hilfe:

    Code
    @error: Meaning 
    0: Array is valid. Check @extended for next offset 
    1: Array is invalid. No matches. 
    2: Bad pattern, array is invalid. @extended = offset of error in pattern. 

    Man kann also aus dem @error und @extended ableiten, was schief gegangen ist und wie man es beheben kann.

  • Funktion mit unbestimmter Anzahl von Parametern

    • Kanashius
    • 23. Oktober 2025 um 19:11

    Als Ergänzung:

    Du kannst auch mit @NumParams die Anzahl der übergebenen Parameter ausgeben lassen.
    Dann ist immer bekannt, ob die Variable übergeben wurde oder nicht, ohne den Inhalt prüfen zu müssen.

    AutoIt
    ConsoleWrite("-------------------"&@crlf)
    _test(1)
    ConsoleWrite("-------------------"&@crlf)
    _test(2,3,4)
    ConsoleWrite("-------------------"&@crlf)
    _testReqParams(1, 2, 3, 4)
    
    Func _test($p0=Default, $p1=Default, $p2=Default, $p3=Default, $p4=Default, $p5=Default, $p6=Default, $p7=Default, $p8=Default, $p9=Default, $p10=Default)
    	For $i=0 To @NumParams-1
    		ConsoleWrite($i&": "&Eval("p"&$i)&@crlf)
    	Next
    EndFunc
    
    Func _testReqParams($someRequiredParam, $otherParam, $p0=Default, $p1=Default, $p2=Default, $p3=Default, $p4=Default, $p5=Default, $p6=Default, $p7=Default, $p8=Default, $p9=Default, $p10=Default)
    	ConsoleWrite($someRequiredParam&@crlf)
    	ConsoleWrite($otherParam&@crlf)
    	For $i=0 To @NumParams-3
    		ConsoleWrite($i&": "&Eval("p"&$i)&@crlf)
    	Next
    EndFunc
    Alles anzeigen

    Beliebig viele Parameter werden aber recht selten genutzt (weshalb es in AutoIt auch keine wirkliche Implementierung dafür gibt, ohne Umwege wie Eval zu nutzen).
    Andere Sprachen ermöglichen es z.B., dass der letzte Parameter z.B. als public static void func(String something, String... optional) angegeben wird, wo man beliebig viel übergeben kann und das wird dann in ein Array umgewandelt => String[] optional.
    Es hat aber wenige Anwendungsfälle, die normal auch anders gelöst werden können.

    Schau dir also deinen Anwendungsfall nochmal genau an, ob du das wirklich brauchst. In den meisten Fällen deutet das auf einen Design Fehler in deiner Software Architektur hin :)

    LG, Kanashius

  • FileSelectFolder()

    • Kanashius
    • 8. Oktober 2025 um 16:15

    Da FileSelectFolder nicht so gut funktioniert, kannst du ja ggf. meine UDF ausprobieren: TreeListExplorer UDF um eine TreeView/ListView zum navigieren von Ordnern/Dateien zu nutzen

    Du kannst ein Fenster mit einer TreeView erstellen und die TreeView dann an die UDF übergeben und angeben, dass nur Ordner angezeigt werden sollen.
    Das dürfte ein recht einfacher Weg sein, den FileSelectFolder Dialog nachzubauen.
    Die UDF unterstützt auch Input-Controls und ListViews, du kannst also theoretisch das gesamte FileSelectFolder interface nachbauen, wenn du möchtest.

    Bei Fragen dazu kann ich dir ggf. weiterhelfen.
    Ich hab nur keine WinPE umgebung um irgendwas zu testen.

    LG Kanashius

  • Windows Graphics Capture API (WinRT) Fullscreen Capturing Test

    • Kanashius
    • 27. August 2025 um 16:03
    Zitat von UEZ

    Kanashius ist denn 2560 x 1440 nicht die tatsächliche Auflösung deines primären Monitors?

    Nope, 3840x2160 ist die eigentliche Auflösung, die aber von manchen Anwendungen (mit Fullscreen) falsch ?angenommen wird. Witzigerweise war der gelbe Rahmen um den ganzen (4k-)Bildschirmbereich, auch wenn der Aufnahmebereich mit 2560x1440 kleiner war :).

    Im moment hab ich 2xFHD und 1x4k (primary).

  • Windows Graphics Capture API (WinRT) Fullscreen Capturing Test

    • Kanashius
    • 27. August 2025 um 15:08
    Code
    Target fps: 30
    Recording time: 20 seconds
    Recording screen dim: 2560 x 1440
    
    Starting fullscreen capturing in 3 seconds...
    kmin: 24
    kmax: 38
    ellapsed: 20.29149640002288 seconds
    frames captured: 179        8.821429256434639 fps
    frame index: 179            8.821429256434639 fps
    delta : 0                   0 %
    total frames: 600           target fps 30 delta: 0.2983333333333333 %
    File size: 12987190 bytes
    
    Done
    Alles anzeigen

    Von meinem 4k Bildschirm. Da wurde dann der rechte+untere Rand abgeschnitten. (Hab aber auch bei manchen Spielen,... das Problem, dass manchmal die geringere Auflösung genommen wird und ich die richtige Auflösung manuell wählen muss oder "borderless" statt vollbild nehme.

  • Splashscreen-Gui mit Terminate Button / GuiEvents richtig abfangen

    • Kanashius
    • 21. August 2025 um 15:54
    Zitat von hipfzwirgel

    dauert der Vorgang mit ziemlicher Sicherheit zu lang für Adlibregister

    AdlibRegister arbeitet mit interrupts, es würde also das, was gerade in dem Programm läuft unterbrechen um AdlibRegister auszuführen und dann mit dem Programm weiterzumachen.

    Alles was in der von "AdlibRegister" aufgerufenen Funktion passiert, sollte nur nicht zu lang sein, da es das "Programm" pausiert und wenn die Funktion nicht beendet wird, würde es das "Programm" blockieren.
    Das Programm darf aber länger dauernde Aufgaben ausführen, da das für den AdlibRegister aufruf unterbrochen wird.

    AdlibRegister ist also genau das, was du willst. Es gibt dir die Möglichkeit das "Programm" kurz zu unterbrechen, zu schauen, ob ein Button o.ä. geklickt wurde und führt dann weiter das "Programm" aus.
    In dieser Unterbrechung kann dann zum Beispiel eine Variable wie "$bStopProgress" geändert werden, wie ich es in meinem Beispiel gemacht habe, und das "Programm" kann darauf reagieren, indem es z.B. die aktuelle For-Schleife verlässt.

  • Splashscreen-Gui mit Terminate Button / GuiEvents richtig abfangen

    • Kanashius
    • 20. August 2025 um 18:23

    In dem folgenden Code, wird die _mainLoop durch "AdlibRegister" auch während des Prozesses (mit sleep,...) aufgerufen. Du musst nur vorsichtig sein, dass du in _mainLoop keine länger dauernden Funktionen aufrufst, wenn es von AdlibRegister aufgerufen wurde. Das würde dann alles blockieren. Stattdessen wird dort nur kurz $bStopProgress auf True gesetzt und das Splashfenster gelöscht, bevor es weitergeht.

    Der Prozess wird durch das If $bStopProgress Then ExitLoop unterbrochen. Dadurch wird sichergestellt, dass eine Aufgabe immer erfolgreich durchläuft und nur zwischen der Aufgabe und der nächsten unterbrochen wird. Bis zum wirklichen unterbrechen dauert es also maximal solange, wie eine einzelne Aufgabe (Ein For-Schleifendurchgang) benötigt. Wenn dir das zu lange dauert, müsstest du die Aufgabe wieder in Abschnitte unterteilen, zwischen denen (mit $bStopProgress) unterbrochen werden kann.

    Ich hoffe, das Beispiel hilft dir weiter:

    AutoIt
    #include <GUIConstantsEx.au3>
    Global $hGuiMain = -1, $hGuiSplash = -1, $bStopProgress = False, $iProgressMax = 0, $idCtrlProgress, $idCtrlProgressStart
    
    _mainGuiCreate()
    
    While True
    	_mainLoop()
    WEnd
    
    Func _mainLoop()
    	Local $arMsg = GUIGetMsg(1)
    	Switch $arMsg[1]
    		Case $hGuiMain
    			Switch $arMsg[0]
    				Case $GUI_EVENT_CLOSE
    					Exit
    				Case $idCtrlProgressStart
    					_startProgress()
    			EndSwitch
    		Case $hGuiSplash
    			Switch $arMsg[0]
    				Case $GUI_EVENT_CLOSE
    					_splashGuiDestroy()
    			EndSwitch
    	EndSwitch
    EndFunc
    
    Func _onMainClose()
    	Exit
    EndFunc
    
    Func _mainGuiCreate()
    	Global $iWidth = 800, $iHeight = 600
    	$hGuiMain = GUICreate("", $iWidth, $iHeight)
    	$idCtrlProgressStart = GUICtrlCreateButton("Start splash", 10, 10, $iWidth-20, 25)
    	GUISetState(@SW_SHOW, $hGuiMain)
    EndFunc
    
    Func _startProgress()
    	$bStopProgress = False
    	_splashGuiCreate()
    	$iProgressMax = 10
    	AdlibRegister("_mainLoop", 10)
    	For $i=0 to $iProgressMax
    		Sleep(1000) ; your task to do ("Aufgabe")
    		GUICtrlSetData($idCtrlProgress, Int((100/$iProgressMax)*$i))
    		
    		_mainLoop()
    		If $bStopProgress Then ExitLoop
    	Next
    	AdlibUnRegister("_mainLoop")
    	GUICtrlSetData($idCtrlProgress, 100)
    	$bStopProgress = False
    	_splashGuiDestroy()
    EndFunc
    
    Func _splashGuiCreate()
    	If $hGuiSplash=-1 Then
    		GUISetState(@SW_DISABLE, $hGuiMain)
    		Local $iWidth = 400, $iHeight = 200
    		$hGuiSplash = GUICreate("Splash", $iWidth, $iHeight, -1, -1, -1, -1, $hGuiMain)
    		$idCtrlProgress = GUICtrlCreateProgress(10, 10, $iWidth-20, 20)
    		GUISetState(@SW_SHOW, $hGuiSplash)
    	EndIf
    EndFunc
    
    Func _splashGuiDestroy()
    	If $hGuiSplash<>-1 Then
    		$bStopProgress = True
    		GuiDelete($hGuiSplash)
    		GUISetState(@SW_ENABLE, $hGuiMain)
    		$hGuiSplash = -1
    	EndIf
    EndFunc
    Alles anzeigen

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™