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

  • 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
  • Dateipfad mit Makronamen besetzen

    • Kanashius
    • 24. Juli 2025 um 13:44

    Ich wüsste auf die schnelle keine, aber ich würde nicht generell ersetzen, sondern nur mit/bei dem absoluten Pfad...

    Gerade bei den @UserName Beispiel kann es ja sein, dass jemand woanders auch einen Ordner mit dem Namen hat (z.B. auf dem Desktop), der aber nicht erzetzt werden sollte.
    z.B. wenn du als @UserName=BugFix einen Ordner mit Bildern von einem Ausflug hast, wo jeder seine Bilder teilt, mit C:\users\BugFix\Desktop\AusflugBilder\Kanashius, C:\users\BugFix\Desktop\AusflugBilder\BugFix ,... Dann sollte ja nur das erste BugFix ersetzt werden.

    Aber kommt natürlich drauf an, wofür genau du das machen willst.

  • Android 12 - WLAN priorisieren

    • Kanashius
    • 16. Juni 2025 um 23:56
    Zitat von BugFix

    Ich benötige die alte Internetverbindung noch für meine Telefonie. Die DECT Telefone nutzen die DSL Verbindung der Fritz.Box. Ich schaue mich derzeit nach preislich interessanten SIP Anbietern um, dann kann die alte Internetverbindung weg.

    Ich werde bei uns auch bald auf Wifi SIP Telefone wechseln und hab Grandstream ins Auge gefasst: https://www.grandstream.com/products/ip-vo…y/wifi-cordless

  • Switch GUI

    • Kanashius
    • 12. Juni 2025 um 16:58

    Eine Loop, oder du nutzt den OnEvent mode (https://www.autoitscript.com/autoit3/docs/g…OnEventMode.htm), dann hast du garkeine (GuiGetMsg) Loop mehr.

  • Probs beim Auslesen einer Website

    • Kanashius
    • 11. Juni 2025 um 18:30

    Hmm...

    Ich kann dir gerne anbieten, einmal gemeinsam mit dir draufzuschauen, falls du discord hast und dem AutoIt-Server beitreten möchtest ( https://discord.gg/5DWTpZK3QN ).

    Das würde aber frühestens morgen abend gehen.

    LG Kanashius

  • Probs beim Auslesen einer Website

    • Kanashius
    • 11. Juni 2025 um 09:36

    Hi, das hört sich erstmal gut an.

    Wenn die Daten mit JS zur Laufzeit ins HTML eingefügt werden gibt es im Hintergrund ziemlich sicher eine extra Abfrage die die Daten (vmtl. als Json) zurückgibt, was dann mit JS verarbeitet und ins HTML eingefügt wird.

    Du kannst mal (in Firefox) unter Tools->Browser Tools->Web Developer Tools auswählen und dort auf den Reiter Network gehen. Danach die Seite neuladen.
    Dort dürfte dann eine ganze Liste an Dateien abgerufen werden. Schau in der Tabelle dann unter "Type" nach json (oder generell alles mal durchschauen).
    Wenn du auf einen Eintrag klickst öffnet sich rechts ein Fenster, dort kannst du unter "Response" schauen was auf die Anfrage geantwortet wurde (ggf. den "Raw" toggle umlegen) irgendwo müssten dort die gewollten Daten auftauchen.
    Wenn du den passenden Eintrag gefunden hast: Rechtsklick->Copy Value->Copy as cUrl
    Das Ergebnis kannst du dann hier posten (nachdem du private Infos, die da drin sein könnten, wie host, user, passwort,... durch Beispieldaten ersezt hast (nicht komplett löschen, nur z.B. "SuperPasswort" durch "12345678" oder so ersetzen, wir müssen wissen, ob es gebraucht wird).


    LG Kanashius

  • Probs beim Auslesen einer Website

    • Kanashius
    • 10. Juni 2025 um 14:26

    Hi :)

    Für die Browserautomation gibt es die WebDriver UDF in AutoIt (z.B. https://www.autoitscript.com/wiki/WebDriver).
    Ich hab sie selbst nicht genutzt. SOLVE-SMARTist dort meines wissens nach aktiver. Ich bin gerade eher in python mit selenium (ChromeWebDriver), BeautifulSoup,... unterwegs, wenn du dahin wechseln möchtest könnte ich dir eher weiterhelfen.

    Ansonsten wäre es sinnvoll, sich mal genauer anzuschauen, was auf der Webseite passiert (Web Developer Tools, insbesondere der Network Tab), vllt. wird nur eine bestimmte api abgerufen oder man könnte sich direkt mit einem WebSocket verbinden,... wäre alles einfacher und zuverlässiger als webseiten automatisierung (insbesondere mit Send,...).

    LG, Kanashius

  • _ScreenCapture_Capture() ohne Hilfsdtei verwennden

    • Kanashius
    • 4. Juni 2025 um 13:11

    Ich vermute mal, du willst dir eher die Pixel anschauen und damit weiterarbeiten, und nicht den "String", der nur ein String aus binärdaten ist, die eine enkodierte (bitmap) datei ergibt.

    Wenn du tatsächlich das ganze z.B. als JPG im Abreitsspeicher haben willst, schau dir mal: _GDIPlus_ImageSaveToStream ( $hImage, $pStream, $tEncoder [, $tParams = 0] )

    Ansonsten dürfte dir das hier alle Informationen geben, die du brauchst:

    AutoIt
    #include <ScreenCapture.au3>
    Global $Left=113,$Top=178,$Width=3,$Height=2
    
    
    Local $arPixels = _screenGetPixel(113, 178, 3, 2)
    For $i=0 To UBound($arPixels)-1
    	For $j=0 To UBound($arPixels, 2)-1
    		If $j<>0 Then ConsoleWrite(" : ")
    		ConsoleWrite(StringFormat("%03d %03d %03d %03d", $arPixels[$i][$j][0], $arPixels[$i][$j][1], $arPixels[$i][$j][2], $arPixels[$i][$j][3]))
    	Next
    	ConsoleWrite(@crlf)
    Next
    
    
    Func _screenGetPixel($iLeft, $iTop, $iWidth, $iHeight)
    	_GDIPlus_Startup()
    	Local $hBitmapScreenCapture = _ScreenCapture_Capture("", $iLeft, $iTop, $iLeft + $iWidth, $iTop + $iHeight)
    	Local $hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hBitmapScreenCapture)
    	If @error Then Return -1
    	Local $iBitmapWidth = _GDIPlus_ImageGetWidth($hBitmap)
    	Local $iBitmapHeight = _GDIPlus_ImageGetHeight($hBitmap)
    	Local $arPixels[$iBitmapWidth][$iBitmapHeight][4]
    	For $i=0 To $iBitmapWidth-1
    		For $j=0 To $iBitmapHeight-1
    			Local $iColor = _GDIPlus_BitmapGetPixel($hBitmap, $i, $j)
    			$arPixels[$i][$j][0] = BitAND(BitShift($iColor, 24), 0xFF)
    			$arPixels[$i][$j][1] = BitAND(BitShift($iColor, 16), 0xFF)
    			$arPixels[$i][$j][2] = BitAND(BitShift($iColor, 8), 0xFF)
    			$arPixels[$i][$j][3] = BitAND($iColor, 0xFF)
    		Next
    	Next
    	_GDIPlus_BitmapDispose($hBitmap)
    	_WinAPI_DeleteObject($hBitmapScreenCapture)
    	_GDIPlus_Shutdown()
    	Return $arPixels
    EndFunc
    Alles anzeigen

    Die Funktion gibt dir ein Array mit der Farbe jedes Pixels als ARGB ([A, R, G, B]).

    Es dürfte aber deutlich bessere Lösungen geben als das hier.
    Dafür müssten wir aber wissen, wofür du das ganze haben möchtest. ScreenCapture ist vermutlich garnicht das was du brauchst.

  • AutoIt-Hackathon #3 "alte Zeiten"

    • Kanashius
    • 12. Mai 2025 um 17:16
    Zitat von Moombas

    Die tatsächliche Anforderung wäre hier also: "Input date in the format "DD/MM/YYYY HH:MM:SS" "

    Die [] klammern werden tatsächlich normalerweise so angegeben um zu signaliesieren, dass etwas optional ist. Richtig wäre also eher: DD/MM/YYYY[ HH[:MM[:SS]]], da die Zeit nochmal mehrere optionale Felder hat.

    Aber ja, ich bin auch darüber gestolpert... Das erste mal mit DD/MM/YYYY statt YYYY/MM/DD und dann mit dem optionalen,... Irgendwann hab ich mir gedacht, ich ignorier das vorgegebene Muster und ersetze einfach alle Zahlen, dann ist definitiv alles abgedeckt :D

  • AutoIt-Hackathon #3 "alte Zeiten"

    • Kanashius
    • 12. Mai 2025 um 00:45

    Etwas später, aber besser spät als nie ;)

    AutoIt
    ; ================================= entferne alle Leer- und Kommentarzeilen und poste diesen Code-Block im Thread ==================================
    Func _IntegerToRoman($sInteger)
    	Local Static $arPattern=["", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"]
    	Local Static $arNumbers=[["I", "V"], ["X", "L"], ["C", "D"], ["M", ""], ["", ""]]
    	Local $arData = StringSplit($sInteger, "", 3)
    	Local $sResult = ""
    	For $i=0 To UBound($arData)-1 Step 1
    		Local $sSym1 = $arNumbers[UBound($arData)-$i-1][0]
    		Local $sSym2 = $arNumbers[UBound($arData)-$i-1][1]
    		Local $sSym3 = $arNumbers[UBound($arData)-$i][0]
    		$sResult &= StringReplace(StringReplace(StringReplace($arPattern[$arData[$i]], "X", $sSym3), "V", $sSym2), "I", $sSym1)
    	Next
    	Return $sResult
    EndFunc   ;==>_IntegerToRoman
    Func _RomanToInteger($sRoman)
    	Local $arData = StringSplit($sRoman, "", 3), $iResult = 0, $iBefore = 0
    	For $i=0 To UBound($arData)-1 Step 1
    		Local $iAdd = 0
    		Switch $arData[$i]
    			Case "M"
    				$iAdd+=1000
    			Case "D"
    				$iAdd+=500
    			Case "C"
    				$iAdd+=100
    			Case "L"
    				$iAdd+=50
    			Case "X"
    				$iAdd+=10
    			Case "V"
    				$iAdd+=5
    			Case "I"
    				$iAdd+=1
    		EndSwitch
    		If $iBefore<$iAdd Then
    			$iResult-=$iBefore*2
    		EndIf
    		$iResult+=$iAdd
    		$iBefore = $iAdd
    	Next
    	Return $iResult
    EndFunc   ;==>_RomanToInteger
    Func _DateToRoman($sDate) ;Input date in the format "YYYY/MM/DD[ HH:MM:SS]", Output in same date-format with roman sign
    	Local $arDate = StringRegExp($sDate, "\d+", 3)
    	$sDate = StringRegExpReplace($sDate, "\d+", "$")
    	For $i=0 To UBound($arDate)-1
    		$sDate = StringReplace($sDate, "$", _IntegerToRoman($arDate[$i]), 1)
    	Next
    	Return $sDate
    EndFunc   ;==>_DateToRoman
    ; ================================= entferne alle Leer- und Kommentarzeilen und poste diesen Code-Block im Thread ==================================
    Alles anzeigen
  • Datenbank : Teil 1 erstellen einer DB

    • Kanashius
    • 8. Mai 2025 um 16:37

    Hi Alina,

    Ich hab das ganze diesmal auch in eine SQLite Datenbank geschrieben.
    Nur den Tagesverbrauch hab ich weggelassen, da ich den noch nicht wirklich verstanden habe (ist das ein Durchschnitt nach Monatstag? weil es ist kein Datum dabei um einen bestimmten Monat anzugeben).

    Achte auch darauf, dass ich nicht nur die Tabellen angelegt habe, sondern auch einige Views als Beispiel zur Datenabfrage.
    Die Views können wie Tabellen auch in SQL-Abfragen verwendet werden.

    Was das Datum und die Beträge angeht: Lass sie als YYYY-MM-DD und 10.0 in der Datenbank. Das sind die Internationalen Standards, die SQLite automatisch erkennt und verwendet. Ansonsten kann bei den SQLite Operationen (Wie Summe (SUM), Durchschnitt (AVG), Runden (ROUND),...) und den Vergleichen für die Abfragen einiges schief gehen.

    Mach erst alles in SQLite und am Ende baust du dir die Deutsche Variante daraus (In SQL oder AutoIt, je nachdem, wie es besser passt).

    Ein Beispiel für SQLite: SELECT ID, Account, AccountName, Type, TypeName, strftime('%d.%m.%Y %H:%M:%S', Time) as TimeDE, REPLACE(CAST(Change as text), '.', ',') as ChangeDE FROM CombinedBalanceForCalculations

    Edit: Hab die Datenbank noch mit mehr Beispieldaten befüllt (2024/2025) und die Saldo Views überarbeitet, um nicht nur die Veränderung, sondern auch den aktuellen Stand mit auszugeben (z.B. SaldoBefore, SaldoAfter für jeden Monat)

    Dateien

    db_ahl_kanashius.zip 8,09 kB – 240 Downloads
  • array(s) nach daten durchsuchen und zuordnen und damit dann ein neues array anlegen

    • Kanashius
    • 3. Mai 2025 um 15:29


    Hier mal, wie ich die Fragestellungen angehen würde:
    Zu 1.:
    - Liste mit allen Strecken anlegen (mit IDs e.g. StreckenID (nummer zur identifizierung für PC) und Namen (identifizierung für Menschen; muss nicht eindeutig sein))
    - Liste mit Weichen/"Kreuzungen" erstellen (mit eigener WeichenID) und einer Liste mit StreckenIDs, wo man von dort hin kann, keine Ahnung, ob Weichen auch namen brauchen
    - ggf. die Liste mit StreckenIDs in eingehende/ausgehende Strecken unterteilen. Weiche X (WeichenID 1) geht z.b. von Strecke A (StreckenID 1) nach Strecke B (StreckenID 2) oder C (StreckenID 3)
    - Man könnte das ganze dann sogar erweitern mit einer Liste an koordinaten für jede Strecke (Als Pfad, der die Strecke definiert) und das ganze visuell als Grafik abbilden
    - _GDIPlus_GraphicsDrawClosedCurve

    - Die Daten würde ich nicht als INI, sondern als JSON anlegen:
    - https://github.com/Sylvan86/autoit-json-udf dort die JSON.au3 herunterladen
    Das würde dann so aussehen:

    Code
    {
     "Strecken": {
       "1": {
         "name": "A",
         "path": [
           [0, 0],
           [15, 0]
         ]
       },
       "2": {
         "name": "B",
         "path": [
           [5, 5],
           [10, 0]
         ]
       },
       "3": {
         "name": "C",
         "path": [
           [5, 5],
           [5, 10]
         ]
       }
     },
     "Weichen":{
       "1": {
         "in": [1],
         "out": [2,3]
       }
     }
    }
    Alles anzeigen


    Wenn du das mit _JSON_Parse einliest, bekommst du direkt eine Map mit allen Daten.
    Ich würde auch darüber nachdenken, das mit SQL (SQLite) zu lösen und in einer Datenbank abzulegen, das würde aber eine Menge der Logik nach SQL verlegen, was vllt. schwerer für dich wäre.

    Zu 2.:
    - da müsste ich mehr wissen um aktiv zu helfen, bzw. Beispiele zu geben

    Zu 3.:
    - Schau dir mal Endliche Automaten (Finite-state machines) an. Da werden States definiert, und von einem State geht man unter bestimmten bedingungen in einen anderen State über.
    Bei jedem State würde man dann für alle Ampeln den aktuellen status (Ampel Farbe) festlegen

    Zu 4/5.:
    - Ok, da hast du ja schon was :)

    Zu 6.:
    - Da würde ich wirklich in Richtung Datenbank mit SQLite schauen, die sind genau für sowas ausgelegt und ein paar einfache Abfragen sollten zu machen sein.

    Zu 7.: Spaß ist die Hauptsache :)

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™