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

Beiträge von BLinz

  • Autoit exe und Windows 10 Firewall / Antivirus

    • BLinz
    • 10. Juli 2017 um 17:12

    Du kannst auch im Windows 10 Defender Ordner ausnehmen (habe ich z.B. für meine AutoIt Ordner gemacht),
    wenn du dorthin runterlädst solltest du dann keine Probleme haben.

    Findest du unter

    • Einstellungen
    • Update und Sicherheit
    • Windows Defender
    • Ausschlüsse -> Ausschlüsse hinzufügen

    Genaueres auch unter Anleitungen Defender ;)

  • AutoIt-Heise-Newsticker

    • BLinz
    • 10. Juli 2017 um 10:24
    Zitat von UEZ

    Dein Konverter macht aus ARGB ein ABGR, wenn wir annehmen, dass der Farbwert als ARGB kodiert ist.

    Mist. Ich hatte _ChooseColor(1) statt _ChooseColor(2) genommen.
    Sorry

    @Kanashius : Und deshalb hatte meinen "simplen" Behandlungsversuche auch immer keinen Erfolg. Vielen Dank für die Erklärung, ich hab deine Funktion mal 1:1 übernommen

  • AutoIt-Heise-Newsticker

    • BLinz
    • 9. Juli 2017 um 22:26
    Zitat von bazii

    Die Hintergrundfarbe der Laufschrift von Hex zu ARGB anzupassen war ein bischen schwierig für mich. Doch UEZ hat mal einen keinen RGB to ARGB converter gepostet. Damit war das kein Problem mehr.

    Zufällig habe ich den heute auch gesehen und in mein Programm eingebaut.
    Aber @UEZ:

    Der hat einen Fehler, Rot und Blau sind vertauscht und somit kommen falsche Farben raus.
    Richtig wäre es so rum

    AutoIt
    $color_hex_rgb = 0x1188AA
        $Red = BitAND($color_hex_rgb, 0xFF)
        $Green = BitAND(BitShift($color_hex_rgb, 8), 0xFF)
        $Blue = BitAND(BitShift($color_hex_rgb, 16), 0xFF)
        $color_argb = 0xFF000000 + $Red * 0x10000 + $Green * 0x100 + $Blue
        MsgBox(0, "Test", Hex($color_argb, 8))

    da ich immer erst mit Grün getestet hatte ist es mir erst spät aufgefallen.

    Nachtrag: Ich könnte da auch einen ARGB zu RGB Konverter gut brauchen ....

  • Nachricht senden an alle in Netzwerk (evtl. via broadcast)

    • BLinz
    • 9. Juli 2017 um 22:21

    Zudem wird ein TCP-Client / Server nicht funktionieren wenn die Benutzer lokal zu wenig rechte haben.
    Da poppt dann nämlich eine Meldung auf das Programm X eine Netzwerkverbindug aufbauen will und man soll die erlaubten Netzwerke auswählen.
    Zum erlauben braucht es Admin-Rechte (UAC poppt auf)

    Aber mittels einer Datei über eine Freigabe ginge. Dein Programm schreibt in die Datei, liest den Inhalt alle paar Sekunden ein und schreibt was da steht.
    Wäre auch nicht so kompliziert umzusetzen.

  • Kleine Programmierung

    • BLinz
    • 8. Juli 2017 um 16:03

    Ich weis ja nicht was du da machst, aber ...

    Du brauchst sehr große Zahlen ... da gäbe es das hier: µit - September
    Statt mit For $i solltest du dann mit


    AutoIt
    Zahl = 0
    While 1
        $Zahl = Zahl + 1
        ...
        ...
        If $Zahl > xxx Then ExitLoop
    Wend

    Ggf. Mit dem BigInt-Funktionen aus dem anderen Artikel.

    Alternativ baust du dir die großen Zahlen aus 2 Text-Schnipseln zusammen: $LinkerTeil & $RechterTeil, Das mit dem While solltest du trotzdem so machen

    Aber erkläre mir doch bitte mal was du da mit machst :)

  • WMI Windows-Updates Dokumentation/ Kritische Windows-Updates über WMI abfragen

    • BLinz
    • 7. Juli 2017 um 21:28
    Zitat von Tweaky

    Ne ich will natürlich nicht alle Updates deaktivieren, sondern nur bestimmte wie z. B. Silverlight.

    Naja, du musst die KB schon vorher kennen. Oder du gehst nach Stichwörtern in der Beschreibung.
    Stichwörter klingt nicht so zuverlässig.

  • WMI Windows-Updates Dokumentation/ Kritische Windows-Updates über WMI abfragen

    • BLinz
    • 7. Juli 2017 um 18:09
    Zitat von Tweaky

    Ist dies auch möglich gleiche alle Updates (also auch die noch nicht in Windows-Update erscheinen) auszublenden?

    Klar geht das, stellt man bei Windows Updates ein und nennt sich "Nie nach Updates suchen (nicht empfohlen)"
    Dem schließe ich mich aber an.

  • WMI Windows-Updates Dokumentation/ Kritische Windows-Updates über WMI abfragen

    • BLinz
    • 6. Juli 2017 um 21:55
    Zitat von Tweaky

    Interessant ...
    Gibt es auch eine Möglichkeit über diese Art und Weise Updates auszublenden?

    Hier findest du ein entsprechendes VB Script: https://serverfault.com/questions/1458…e-hotfix/341318

    In dem Script wird das nicht gewünschte Update auf versteckt gesetzt:

    AutoIt
    update.IsHidden = True

    Die Zeile könnte man 1:1 einfach ob ins Skript einbauen => natürlich mit zusätzlicher Vorauswahl

    Also ja, würde gehen (behaupte ich mal ohne es getestet zu haben)

  • GUI / Fenster Größenänderung - wie geht das mit GDIPlus Elementen?

    • BLinz
    • 6. Juli 2017 um 20:19

    Nachtrag an @Oscar: Deine _GuiCtrlSetImageEx() funktioniert Traumhaft!
    Ich versuche es erst einmal mit dieser.

    DANKE! :thumbup:

  • GUI / Fenster Größenänderung - wie geht das mit GDIPlus Elementen?

    • BLinz
    • 6. Juli 2017 um 19:43

    Irgendwie habe ich befürchtet das es so kompliziert wird. Zum einen weil es von dir dann bestimmt gleich so gemacht worden wäre.
    Zum anderen weil ich praktisch nichts dazu gefunden habe.


    Zitat von Oscar

    Das heißt, dass Du zuerst den alten Inhalt löschen musst (mit der Hintergrundfarbe übermalen). Erst dann kannst Du die Bitmap und Graphic löschen und neu erstellen.

    Mhh, aber beim verkleinern liegen ja an der zu übermalenden Stellen wieder andere Controls, oder?


    Und das Problem beim vergrößern? Warum ist da plötzlich "Ende" ?


    Ich schaue mir mal dein Beispiel an (und lerne)

    Das Pic-Control wäre natürlich sehr einfach, das kann ich genauso anheften wie alles andere.
    Das Bild-Seitenverhältnis könnte ich auch dadurch anpassen das ich per GUICtrlSetPos() oder ControlMove() das Pic-Control anpasse.
    Sieht dann natürlich komisch aus, ich meine ich hatte das bei anderen so schon mal gesehen.
    Ich könnte darunter ja wieder ein 2. Control als Hintergrund setzen.

    Danke!

  • GUI / Fenster Größenänderung - wie geht das mit GDIPlus Elementen?

    • BLinz
    • 6. Juli 2017 um 16:14

    Neulich bin ich über @Oscar 's FotoSort gestolpert (Weil das Thema wieder gepuscht wurde).

    Das Programm war für mich eine Offenbarung, genau so ein Tool fehlte mir.
    Ein paar Dinge hätte ich schon gern anders. Unter anderem war mit die Darstellung bei HD-Auflösung zu klein (Vollbild wollte ich nicht) und zu wenig Pfade. Ich will den Platz besser ausnutzen.

    Also habe ich mich an eine alternative Version gewagt.
    Unter anderem wollte ich etwas schaffen was ich noch nie hinbekommen habe: Eine GUI/Form die ich in der Größe ändern kann.

    Die GUI an sich funktioniert, auch das hinzufügen weiterer Dateipfade (und das entfernen dieser wenn der Platz nicht mehr reicht).

    Aber wie macht man das mit dem Bild-Preview welches per GDIPlus erstellt wird? Ich hatte schon verstanden das dieses ja sowieso bei der kleinsten Änderung wieder neu gezeichnet werden muss (WM_PAINT),
    ergo dachte ich das es nach Änderung der GUI-Größe dann halt auch einfach in einer neuen Größe gezeichnet wird.

    Problem Nr. 1: Wenn ich die GUI größer ziehe (nicht maximieren) wird zwar auch die Preview größer. Aber nur bis zu einem Maximalwert, dann hört es auf. Von der Größe her könnte das die Anfangsgröße der GUI sein.
    Ein Bild dazu:

    Spoiler anzeigen


    [Blockierte Grafik: https://znil.net/images/c/ce/ClipCapIt-170706-161613.PNG]

    Problem Nr. 2: Wenn ich die GUI wieder verkleinere bleiben gezeichnete Ränder zurück ... was mache ich am besten dagegen? WM_PAINT zeichnet doch sowieso schon die ganze GUI/Form neu, oder?
    Hier ein Bild:

    Spoiler anzeigen


    [Blockierte Grafik: https://znil.net/images/2/2f/ClipCapIt-170706-161355.PNG]


    Hier der Quelltext:

    AutoIt: FotoSortNeu.au3
    #NoTrayIcon
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiStatusBar.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <GDIPlus.au3>
    
    
    AutoItSetOption("MustDeclareVars", 1)
    AutoItSetOption("GUIOnEventMode", 1)
    
    
    #Region Variablen
    ; #####################################################################################
    ;   ##     ##    ###    ########  ####    ###    ########  ##       ######## ##    ##
    ;   ##     ##   ## ##   ##     ##  ##    ## ##   ##     ## ##       ##       ###   ##
    ;   ##     ##  ##   ##  ##     ##  ##   ##   ##  ##     ## ##       ##       ####  ##
    ;   ##     ## ##     ## ########   ##  ##     ## ########  ##       ######   ## ## ##
    ;    ##   ##  ######### ##   ##    ##  ######### ##     ## ##       ##       ##  ####
    ;     ## ##   ##     ## ##    ##   ##  ##     ## ##     ## ##       ##       ##   ###
    ;      ###    ##     ## ##     ## #### ##     ## ########  ######## ######## ##    ##
    ;~ ####################################################################################
    ; Alle Variablen für die GUI
    Global $h_FormFotoSortNeu
    Global $id_GroupTargetDirectories, $id_ButtonZV1Copy, $id_ButtonZV1Move, $id_InputZV1Path, $id_ButtonZV1SelectPath, $id_ButtonAddZV, $id_ButtonRemoveZV
    Global $id_GroupFileFormats, $id_CheckboxFormat_BMP, $id_CheckboxFormat_TIFF, $id_CheckboxFormat_JPEG, $id_CheckboxFormat_PNG, $id_CheckboxFormat_GIF, $id_CheckboxFormat_ICO, $id_CheckboxFormat_EMF, $id_CheckboxFormat_WMF
    Global $id_GroupFileExists, $id_RadioOverwrite, $id_RadioAddSuffix, $id_InputSuffix, $id_RadioAskOverwrite, $id_CheckboxOnlyIfDifferent, $id_LabelCountingNumber
    Global $id_GroupTools, $id_ButtonTool1, $id_ButtonTool2, $id_ButtonTool3, $id_ButtonTool4, $id_ButtonTool5, $id_ButtonTool6, $id_ButtonTool7, $id_ButtonTool8
    Global $id_GroupQuellverzeichnis, $id_InputSourceDirectory, $id_ButtonSelectSourceDirectory, $id_CheckboxScanFolderRecursive
    Global $id_Picture, $id_ButtonPicBack100, $id_ButtonPicBack10, $id_ButtonPicBack1, $id_ButtonForward1, $id_ButtonForward10, $id_ButtonForward100, $id_ButtonPicGoToFirst, $id_ButtonGoToLast, $id_InputPicNumber, $id_CheckboxPictureFitSize
    Global $id_StatusBar
    
    
    Global $a_id_TargetDirectories[2][5]	; [0][0] = Anzahl
    										; [x][1] = Button kopieren
    										; [x][2] = Butten verschieben
    										; [x][3] = Input
    										; [x][4] = Pfadauswahl
    Global $id_ButtonAddTargetDirectory, $id_ButtonRemoveTargetDirectory
    Global $i_Distance = 44 ; Abstand zwischen den Zeilen
    
    
    ; Fenstergröße sichern / Variablen für erlaubte Größen
    Global $a_FormFotoSortNew_Size
    Global $i_FormFotoSortNew_SizeMinWidth, $i_FormFotoSortNew_SizeMinHeight, $i_FormFotoSortNew_SizeMaxWidth, $i_FormFotoSortNew_SizeMaxHeight
    
    
    ; GDIPlus
    Global $aGDIPlusDecoders, $a_id_CheckboxFileformat[1]
    Global $h_Graphic
    
    
    Global $i_GuiWidth = 1009
    Global $i_GuiHeight = 730
    
    
    Global $h_Bitmap
    Global $h_GraphicBuff
    Global $a_h_Brush[4], $i_BgColor = 0
    Global $h_Texture
    
    
    Global $i_PreviewLeft = 5
    Global $i_PreviewTop = 88
    Global $i_PreviewWidth = 514
    Global $i_PreviewHeight = 530
    
    
    
    
    #EndRegion Variablen
    
    
    #Region Funktionen
    ; ###############################################################################################################################################################################################
    ;   ######## ##     ## ##    ## ##    ## ######## ####  #######  ##    ## ######## ##    ##
    ;   ##       ##     ## ###   ## ##   ##     ##     ##  ##     ## ###   ## ##       ###   ##
    ;   ##       ##     ## ####  ## ##  ##      ##     ##  ##     ## ####  ## ##       ####  ##
    ;   ######   ##     ## ## ## ## #####       ##     ##  ##     ## ## ## ## ######   ## ## ##
    ;   ##       ##     ## ##  #### ##  ##      ##     ##  ##     ## ##  #### ##       ##  ####
    ;   ##       ##     ## ##   ### ##   ##     ##     ##  ##     ## ##   ### ##       ##   ###
    ;   ##        #######  ##    ## ##    ##    ##    ####  #######  ##    ## ######## ##    ##
    ; ###############################################################################################################################################################################################
    ;~       ____ _               _    _               _____ _ _       __                            _
    ;~      / ___| |__   ___  ___| | _| |__   _____  _|  ___(_) | ___ / _| ___  _ __ _ __ ___   __ _| |_
    ;~     | |   | '_ \ / _ \/ __| |/ / '_ \ / _ \ \/ / |_  | | |/ _ \ |_ / _ \| '__| '_ ` _ \ / _` | __|
    ;~     | |___| | | |  __/ (__|   <| |_) | (_) >  <|  _| | | |  __/  _| (_) | |  | | | | | | (_| | |_
    ;~  ____\____|_| |_|\___|\___|_|\_\_.__/ \___/_/\_\_|   |_|_|\___|_|  \___/|_|  |_| |_| |_|\__,_|\__|
    ;~ |_____|
    Func _CheckboxFileformat()
    	; Prüfen ob der Haken bei "Alle" gesetzt oder entfernt wurde
    	If @GUI_CtrlId = $a_id_CheckboxFileformat[0] Then
    		; laut Hilfe darf man den Wert bei Checkboxen direkt nutzen!
    		Local $i_CheckedOrNot = GUICtrlRead($a_id_CheckboxFileformat[0])
    		For $i = 1 To (UBound($a_id_CheckboxFileformat) - 1) Step 1
    			GUICtrlSetState($a_id_CheckboxFileformat[$i], $i_CheckedOrNot)
    		Next
    		; Was wird da gemacht? Wir setzen einfach alle Checkboxen auf den gleichen Wert wie den von $a_id_CheckboxFileformat[0]
    		; Ist die angehakt so wird der Haken überall gesetzt, wird er entfernt wird er wieder überall gelöscht
    	Else
    		; Ok, es war eine der anderen Checkboxen. Wenn auch nur eine von denen nicht aktiviert ist muss der haken bei alle wieder raus
    		; sind alle gesetzt soll der Haken aber rein. Wir setzen ihn erst rein und schauen dann ob er raus muss
    		GUICtrlSetState($a_id_CheckboxFileformat[0], $GUI_CHECKED)
    		For $i = 1 To (UBound($a_id_CheckboxFileformat) - 1) Step 1
    			If GUICtrlRead($a_id_CheckboxFileformat[$i]) = $GUI_UNCHECKED Then
    				GUICtrlSetState($a_id_CheckboxFileformat[0], $GUI_UNCHECKED)
    				ExitLoop
    			EndIf
    		Next
    	EndIf
    EndFunc
    
    
    ; ###############################################################################################################################################################################################
    ;~       ____                _       ____       _   _                _____         _
    ;~      / ___|_ __ ___  __ _| |_ ___|  _ \ __ _| |_| |_ ___ _ __ _ _|_   _|____  _| |_ _   _ _ __ ___
    ;~     | |   | '__/ _ \/ _` | __/ _ \ |_) / _` | __| __/ _ \ '__| '_ \| |/ _ \ \/ / __| | | | '__/ _ \
    ;~     | |___| | |  __/ (_| | ||  __/  __/ (_| | |_| ||  __/ |  | | | | |  __/>  <| |_| |_| | | |  __/
    ;~  ____\____|_|  \___|\__,_|\__\___|_|   \__,_|\__|\__\___|_|  |_| |_|_|\___/_/\_\\__|\__,_|_|  \___|
    ;~ |_____|
    Func _CreatePatternTexture($iLeft, $iTop, $iWidth, $iHeight) ; Danke an UEZ (www.autoit.de)
    	Local $iStep = 8
    	Local $aResult = DllCall($__g_hGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", 2 * $iStep, "int", 2 * $iStep, "int", 0, "int", $GDIP_PXF32ARGB, "ptr", 0, "int*", 0)
    	Local $hPatternBitmap = $aResult[6]
    	Local $hCtxt = _GDIPlus_ImageGetGraphicsContext($hPatternBitmap)
    	_GDIPlus_GraphicsFillRect($hCtxt, 0, 0, $iStep, $iStep, $a_h_Brush[0])
    	_GDIPlus_GraphicsFillRect($hCtxt, $iStep, 0, $iStep, $iStep, $a_h_Brush[1])
    	_GDIPlus_GraphicsFillRect($hCtxt, 0, $iStep, $iStep, $iStep, $a_h_Brush[1])
    	_GDIPlus_GraphicsFillRect($hCtxt, $iStep, $iStep, $iStep, $iStep, $a_h_Brush[0])
    	$aResult = DllCall($__g_hGDIPDll, "uint", "GdipCreateTexture", "handle", $hPatternBitmap, "int", 0, "int*", 0)
    	Local $hTexture = $aResult[3]
    	_GDIPlus_GraphicsFillRect($h_GraphicBuff, $iLeft, $iTop, $iWidth, $iHeight, $hTexture)
    	_GDIPlus_GraphicsDispose($hCtxt)
    	_GDIPlus_BitmapDispose($hPatternBitmap)
    	Return $hTexture
    EndFunc   ;==>_CreatePatternTexture
    
    
    ; ###############################################################################################################################################################################################
    Func _DrawBgColor($iLeft, $iTop, $iWidth, $iHeight)
    	Switch $i_BgColor
    		Case 0
    			_GDIPlus_GraphicsFillRect($h_GraphicBuff, $iLeft, $iTop, $iWidth, $iHeight, $h_Texture)
    		Case 1
    			_GDIPlus_GraphicsFillRect($h_GraphicBuff, $iLeft, $iTop, $iWidth, $iHeight, $a_h_Brush[3])
    		Case 2
    			_GDIPlus_GraphicsFillRect($h_GraphicBuff, $iLeft, $iTop, $iWidth, $iHeight, $a_h_Brush[2])
    	EndSwitch
    EndFunc   ;==>_DrawBgColor
    ; ###############################################################################################################################################################################################
    ;~       _____     _     _               _       _     _
    ;~      |  ___|__ | | __| | ___ _ __    / \   __| | __| |
    ;~      | |_ / _ \| |/ _` |/ _ \ '__|  / _ \ / _` |/ _` |
    ;~      |  _| (_) | | (_| |  __/ |    / ___ \ (_| | (_| |
    ;~  ____|_|  \___/|_|\__,_|\___|_|___/_/   \_\__,_|\__,_|
    ;~ |_____|                      |_____|
    Func _Folder_Add()
    	; Es wurde auf das + geklickt und der Anwender will eine Zeile mehr bekommen
    	; Abstand zwischen den Zeilen festlegen
    ;~ 	Local $i_Distance = 32
    
    
    
    
    	; Wie groß ist die Group überhaupt ?
    	Local $a_GroupSize = ControlGetPos($h_FormFotoSortNeu, "", $id_GroupTargetDirectories)
    	; Platzbedarf: Pro Zeile $i_Distance Abstand mal die Anzahl der Zeilen
    
    
    	If (($a_id_TargetDirectories[0][0] + 1) * $i_Distance) >= ($a_GroupSize[3] - $i_Distance) Then
    		MsgBox(64, "Zuviele Zielverzeichnisse", "Group Höhe: " & $a_GroupSize[3] & @CRLF & "Platzbedarf: " & ($a_id_TargetDirectories[0][0] + 1) & " * " & $i_Distance & " = " & (($a_id_TargetDirectories[0][0] + 1) * $i_Distance) )
    		Return 1
    	EndIf
    	; Array mit den Controls um 1 vergrößern
    	$a_id_TargetDirectories[0][0] = $a_id_TargetDirectories[0][0] + 1
    	ReDim $a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] + 1 ][5]
    
    
    	; Platz schaffen, die Buttons mit + und - eine Zeile tiefer setzen
    	Local $a_ControlPos = ControlGetPos($h_FormFotoSortNeu, "", $a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][1])
    	GUICtrlSetPos($id_ButtonAddTargetDirectory, $a_ControlPos[0], 232 + (($a_id_TargetDirectories[0][0] - 1) * $i_Distance))
    	GUICtrlSetPos($id_ButtonRemoveTargetDirectory, $a_ControlPos[0] + 32, 232 + (($a_id_TargetDirectories[0][0] - 1) * $i_Distance))
    
    
    	; Und die neuen Buttons und Input bauen:
    	; Die Position der Zeile darüber holen (Button kopieren)
    	$a_ControlPos = ControlGetPos($h_FormFotoSortNeu, "", $a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] - 1 ][1])
    
    
    	; Den Button für kopieren
    	$a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][1] = GUICtrlCreateButton($a_id_TargetDirectories[0][0], $a_ControlPos[0], 200 + (($a_id_TargetDirectories[0][0] - 1) * $i_Distance), 33, 25)
    	GUICtrlSetOnEvent($a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][1], "_Picture_Copy")
    	; Diesen und die nachfolgenden Buttons heften wir Rechts und oben an, Größe ist fix
    	GUICtrlSetResizing($a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][1], $GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)
    	GUICtrlSetTip($a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][1], "Datei kopieren")
    
    
    	; Den Button für verschieben
    	$a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][2] = GUICtrlCreateButton("»", $a_ControlPos[0] + 32, 200 + (($a_id_TargetDirectories[0][0] - 1) * $i_Distance), 33, 25)
    	GUICtrlSetOnEvent($a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][2], "_Picture_Move")
    	GUICtrlSetResizing($a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][2], $GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)
    	GUICtrlSetTip($a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][2], "Datei verschieben")
    
    
    	; Das Input mit dem Pfad
    	$a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][3] = GUICtrlCreateInput("", $a_ControlPos[0] + 67, 200 + (($a_id_TargetDirectories[0][0] - 1) * $i_Distance), 354, 25, BitOR($ES_READONLY,$ES_LEFT, $ES_AUTOHSCROLL), BitOR($WS_EX_CLIENTEDGE, $WS_EX_ACCEPTFILES))
    	GUICtrlSetFont($a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][3], 11, 400, 0, "Arial")
    	GUICtrlSetBkColor($a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][3], 0xFFFFE1)
    	GUICtrlSetResizing($a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][3], $GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)
    	; Damit das Feld Drag'n Drop annimmt (muss zusätzlich zum Extended-Style gesetzt werden)
    	GUICtrlSetState($a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][3], $GUI_DROPACCEPTED)
    
    
    	; Und noch der Button für die Pfadauswahl
    	$a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][4] = GUICtrlCreateButton("...", $a_ControlPos[0] + 424, 200 + (($a_id_TargetDirectories[0][0] - 1) * $i_Distance), 33, 25)
    	GUICtrlSetOnEvent($a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][4], "_Folder_Select")
    	GUICtrlSetResizing($a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][4], $GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)
    	GUICtrlSetTip($a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][4], "Pfad wählen")
    
    
    	; Ggf den + Button deaktivieren:
    	Local $a_GroupSize = ControlGetPos($h_FormFotoSortNeu, "", $id_GroupTargetDirectories)
    	If (($a_id_TargetDirectories[0][0] + 1) * $i_Distance) >= ($a_GroupSize[3] - $i_Distance) Then
    		GUICtrlSetState($id_ButtonAddTargetDirectory, $GUI_DISABLE)
    	Else
    		GUICtrlSetState($id_ButtonAddTargetDirectory, $GUI_ENABLE)
    	EndIf
    
    
    	; Den - Button aktivieren:
    	GUICtrlSetState($id_ButtonRemoveTargetDirectory, $GUI_ENABLE)
    
    
    	; Titel der Group anpassen
    	GUICtrlSetData($id_GroupTargetDirectories, " Zielverzeichnisse (1.." & $a_id_TargetDirectories[0][0] & "): ")
    EndFunc
    ; ###############################################################################################################################################################################################
    ;~       _____     _     _            ____
    ;~      |  ___|__ | | __| | ___ _ __ |  _ \ ___ _ __ ___   _____   _____
    ;~      | |_ / _ \| |/ _` |/ _ \ '__|| |_) / _ \ '_ ` _ \ / _ \ \ / / _ \
    ;~      |  _| (_) | | (_| |  __/ |   |  _ <  __/ | | | | | (_) \ V /  __/
    ;~  ____|_|  \___/|_|\__,_|\___|_|___|_| \_\___|_| |_| |_|\___/ \_/ \___|
    ;~ |_____|                      |_____|
    Func _Folder_Remove()
    	; Und wieder weg mit den Zeilen
    	; Falls es die letzte Zeile ist gleich wieder raus
    	If $a_id_TargetDirectories[0][0] = 1 Then
    		GUICtrlSetState($id_ButtonRemoveTargetDirectory, $GUI_DISABLE)
    		Return 1
    	EndIf
    
    
    	; Und löschen
    	For $i = 1 To 4 Step 1
    		GUICtrlDelete($a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][$i])
    		$a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][$i] = ""
    	Next
    	; Array wieder verkleinern
    	$a_id_TargetDirectories[0][0] = $a_id_TargetDirectories[0][0] - 1
    	ReDim $a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] + 1 ][5]
    
    
    	; Die + und - Schaltfläche wieder hochrücken:
    	Local $a_ControlPos = ControlGetPos($h_FormFotoSortNeu, "", $a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][1])
    	GUICtrlSetPos($id_ButtonAddTargetDirectory, $a_ControlPos[0], 232 + (($a_id_TargetDirectories[0][0] - 1) * $i_Distance))
    	GUICtrlSetPos($id_ButtonRemoveTargetDirectory, $a_ControlPos[0] + 32, 232 + (($a_id_TargetDirectories[0][0] - 1) * $i_Distance))
    
    
    	; Sind wir nun die letzte Zeile?
    	If $a_id_TargetDirectories[0][0] = 1 Then
    		GUICtrlSetState($id_ButtonRemoveTargetDirectory, $GUI_DISABLE)
    		Return 1
    	EndIf
    
    
    	; Ggf den + Button wieder aktivieren:
    	Local $a_GroupSize = ControlGetPos($h_FormFotoSortNeu, "", $id_GroupTargetDirectories)
    	If (($a_id_TargetDirectories[0][0] + 1) * $i_Distance) >= ($a_GroupSize[3] - $i_Distance) Then
    		GUICtrlSetState($id_ButtonAddTargetDirectory, $GUI_DISABLE)
    	Else
    		GUICtrlSetState($id_ButtonAddTargetDirectory, $GUI_ENABLE)
    	EndIf
    
    
    
    
    	; Titel der Group anpassen
    	GUICtrlSetData($id_GroupTargetDirectories, " Zielverzeichnisse (1.." & $a_id_TargetDirectories[0][0] & "): ")
    
    
    EndFunc
    ; ###############################################################################################################################################################################################
    ;~       _____     _     _            ____       _           _
    ;~      |  ___|__ | | __| | ___ _ __ / ___|  ___| | ___  ___| |_
    ;~      | |_ / _ \| |/ _` |/ _ \ '__|\___ \ / _ \ |/ _ \/ __| __|
    ;~      |  _| (_) | | (_| |  __/ |    ___) |  __/ |  __/ (__| |_
    ;~  ____|_|  \___/|_|\__,_|\___|_|___|____/ \___|_|\___|\___|\__|
    ;~ |_____|                      |_____|
    Func _Folder_Select()
    	Switch @GUI_CtrlId
    		Case $id_ButtonSelectSourceDirectory
    			MsgBox(0, "", "Quellverzeichnis auswählen")
    		Case Else
    			MsgBox(0, "", "Zeilverzeichnis auswählen")
    	EndSwitch
    EndFunc
    ; ###############################################################################################################################################################################################
    ;~       ____  _      _                      ____
    ;~      |  _ \(_) ___| |_ _   _ _ __ ___    / ___|___  _ __  _   _
    ;~      | |_) | |/ __| __| | | | '__/ _ \  | |   / _ \| '_ \| | | |
    ;~      |  __/| | (__| |_| |_| | | |  __/  | |__| (_) | |_) | |_| |
    ;~  ____|_|   |_|\___|\__|\__,_|_|  \___|___\____\___/| .__/ \__, |
    ;~ |_____|                             |_____|        |_|    |___/
    Func _Picture_Copy()
    	MsgBox(64, "Picture", "Copy!")
    EndFunc
    ; ###############################################################################################################################################################################################
    ;~       ____  _      _                      __  __
    ;~      |  _ \(_) ___| |_ _   _ _ __ ___    |  \/  | _____   _____
    ;~      | |_) | |/ __| __| | | | '__/ _ \   | |\/| |/ _ \ \ / / _ \
    ;~      |  __/| | (__| |_| |_| | | |  __/   | |  | | (_) \ V /  __/
    ;~  ____|_|   |_|\___|\__|\__,_|_|  \___|___|_|  |_|\___/ \_/ \___|
    ;~ |_____|                             |_____|
    Func _Picture_Move()
    	MsgBox(64, "Picture", "Move!")
    EndFunc
    
    
    ; ###############################################################################################################################################################################################
    Func _Preview_Resize()
    	Local $a_NewFormSize = WinGetPos($h_FormFotoSortNeu)
    	Local $i_PlusX = $a_NewFormSize[2] - $a_FormFotoSortNew_Size[2]
    	Local $i_PlusY = $a_NewFormSize[3] - $a_FormFotoSortNew_Size[3]
    	GUICtrlSetData($id_InputPicNumber, "$i_PlusX: " & $i_PlusX & " / $i_PlusY: " & $i_PlusY)
    ;~ 	_GDIPlus_BitmapDispose($h_Bitmap)
    ;~ 	_GDIPlus_GraphicsDispose($h_Graphic)
    
    
    ;~ 	$h_Graphic = _GDIPlus_GraphicsCreateFromHWND($h_FormFotoSortNeu)
    ;~ 	_GDIPlus_GraphicsSetSmoothingMode($h_Graphic, 2)
    ;~ 	$h_Bitmap = _GDIPlus_BitmapCreateFromGraphics($i_GuiWidth, $i_GuiHeight + $i_PlusX, $h_Graphic + $i_PlusY)
    ;~ 	$h_GraphicBuff = _GDIPlus_ImageGetGraphicsContext($h_Bitmap)
    
    
    
    
    	$h_Texture = _CreatePatternTexture($i_PreviewLeft, $i_PreviewTop, $i_PreviewWidth + $i_PlusX, $i_PreviewHeight + $i_PlusY)
    	_GDIPlus_GraphicsDrawRect($h_GraphicBuff, $i_PreviewLeft - 2, $i_PreviewTop - 2, $i_PreviewWidth + 3 + $i_PlusX, $i_PreviewHeight + 3 + $i_PlusY)
    	_GDIPlus_GraphicsDrawRect($h_GraphicBuff, $i_PreviewLeft - 1, $i_PreviewTop - 1, $i_PreviewWidth + 1 + $i_PlusX, $i_PreviewHeight + 1 + $i_PlusY)
    	_DrawBgColor($i_PreviewLeft, $i_PreviewTop, $i_PreviewWidth + $i_PlusX, $i_PreviewHeight + $i_PlusY)
    	_GDIPlus_GraphicsDrawImage($h_Graphic, $h_Bitmap, 0, 0)
    EndFunc
    ; ###############################################################################################################################################################################################
    ;~  _     _     _____                    _____     _       ____             _   _   _             ____ _
    ;~ (_) __| |   |  ___|__  _ __ _ __ ___ |  ___|__ | |_ ___/ ___|  ___  _ __| |_| \ | | ___ _   _ / ___| | ___  ___  ___
    ;~ | |/ _` |   | |_ / _ \| '__| '_ ` _ \| |_ / _ \| __/ _ \___ \ / _ \| '__| __|  \| |/ _ \ | | | |   | |/ _ \/ __|/ _ \
    ;~ | | (_| |   |  _| (_) | |  | | | | | |  _| (_) | || (_) |__) | (_) | |  | |_| |\  |  __/ |_| | |___| | (_) \__ \  __/
    ;~ |_|\__,_|___|_|  \___/|_|  |_| |_| |_|_|  \___/ \__\___/____/ \___/|_|   \__|_| \_|\___|\__,_|\____|_|\___/|___/\___|
    ;~        |_____|
    ; Wird aufgerufen wenn jemand auf das rote X oben rechts klickt oder ESC drückt (siehe in der Hilfe beim Befehl AutoItSetOption("GUICloseOnESC"))
    Func id_FormFotoSortNeuClose()
    	If $h_Texture <> 0 Then _GDIPlus_BrushDispose($h_Texture)
    ;~ 	If $hPreviewBitmap <> 0 Then _GDIPlus_BitmapDispose($hPreviewBitmap)
    	If $h_Bitmap <> 0 Then _GDIPlus_BitmapDispose($h_Bitmap)
    	If $h_GraphicBuff <> 0 Then _GDIPlus_BitmapDispose($h_GraphicBuff)
    	If $h_Graphic <> 0 Then _GDIPlus_GraphicsDispose($h_Graphic)
    	_GDIPlus_Shutdown()
    
    
    	Exit
    EndFunc
    ; ###############################################################################################################################################################################################
    ;~  _     _     _____                    _____     _       ____             _   _   _            ____           _
    ;~ (_) __| |   |  ___|__  _ __ _ __ ___ |  ___|__ | |_ ___/ ___|  ___  _ __| |_| \ | | ___ _   _|  _ \ ___  ___| |_ ___  _ __ ___
    ;~ | |/ _` |   | |_ / _ \| '__| '_ ` _ \| |_ / _ \| __/ _ \___ \ / _ \| '__| __|  \| |/ _ \ | | | |_) / _ \/ __| __/ _ \| '__/ _ \
    ;~ | | (_| |   |  _| (_) | |  | | | | | |  _| (_) | || (_) |__) | (_) | |  | |_| |\  |  __/ |_| |  _ <  __/\__ \ || (_) | | |  __/
    ;~ |_|\__,_|___|_|  \___/|_|  |_| |_| |_|_|  \___/ \__\___/____/ \___/|_|   \__|_| \_|\___|\__,_|_| \_\___||___/\__\___/|_|  \___|
    ;~        |_____|
    ; Wird aufgerufen wenn die GUI nach dem minimieren wieder sichtbar gemacht wird.
    Func id_FormFotoSortNeuRestore()
    
    
    EndFunc
    ; ###############################################################################################################################################################################################
    ;~     _____           _
    ;~    |_   _|__   ___ | |___
    ;~      | |/ _ \ / _ \| / __|
    ;~      | | (_) | (_) | \__ \
    ;~  ____|_|\___/ \___/|_|___/
    ;~ |_____|
    Func _Tools()
    	MsgBox(64, "Tools", "Tools gestartet")
    EndFunc
    ; ###############################################################################################################################################################################################
    ;~   ____ _   _ ___     _______     _______ _   _ _____   ____  ____   ___  ____  ____  _____ ____
    ;~  / ___| | | |_ _|   | ____\ \   / / ____| \ | |_   _| |  _ \|  _ \ / _ \|  _ \|  _ \| ____|  _ \
    ;~ | |  _| | | || |    |  _|  \ \ / /|  _| |  \| | | |   | | | | |_) | | | | |_) | |_) |  _| | | | |
    ;~ | |_| | |_| || |    | |___  \ V / | |___| |\  | | |   | |_| |  _ <| |_| |  __/|  __/| |___| |_| |
    ;~  \____|\___/|___|___|_____|  \_/  |_____|_| \_| |_|___|____/|_| \_\\___/|_|   |_|   |_____|____/
    ;~                |_____|                           |_____|
    Func GUI_EVENT_DROPPED()
    	MsgBox(0, "Datei:", "Id des Controls: " & @GUI_DragId & @CRLF & "Dateiname: " & @GUI_DragFile)
    EndFunc
    ; ###############################################################################################################################################################################################
    ;~ __        ____  __     ____ _____ _____ __  __ ___ _   _ __  __    _    __  _____ _   _ _____ ___
    ;~ \ \      / /  \/  |   / ___| ____|_   _|  \/  |_ _| \ | |  \/  |  / \   \ \/ /_ _| \ | |  ___/ _ \
    ;~  \ \ /\ / /| |\/| |  | |  _|  _|   | | | |\/| || ||  \| | |\/| | / _ \   \  / | ||  \| | |_ | | | |
    ;~   \ V  V / | |  | |  | |_| | |___  | | | |  | || || |\  | |  | |/ ___ \  /  \ | || |\  |  _|| |_| |
    ;~    \_/\_/  |_|  |_|___\____|_____| |_| |_|  |_|___|_| \_|_|  |_/_/   \_\/_/\_\___|_| \_|_|   \___/
    ;~                  |_____|
    ; Dient dazu eine minimale und maximale Größe der GUI durchzusetzen.
    ; gefunden unter: https://www.autoitscript.com/forum/topic/124195-gui-minimum-size/
    Func WM_GETMINMAXINFO($hwnd, $Msg, $wParam, $lParam)
        Local $tagMaxinfo = DllStructCreate("int;int;int;int;int;int;int;int;int;int", $lParam)
        DllStructSetData($tagMaxinfo, 7, $i_FormFotoSortNew_SizeMinWidth) ; min X
        DllStructSetData($tagMaxinfo, 8, $i_FormFotoSortNew_SizeMinHeight) ; min Y
        DllStructSetData($tagMaxinfo, 9, $i_FormFotoSortNew_SizeMaxWidth ); max X
        DllStructSetData($tagMaxinfo, 10, $i_FormFotoSortNew_SizeMaxHeight ) ; max Y
    	_Preview_Resize()
        Return 0
    EndFunc   ;==>WM_GETMINMAXINFO
    ; ###############################################################################################################################################################################################
    ;~ __        ____  __     ____   _    ___ _   _ _____
    ;~ \ \      / /  \/  |   |  _ \ / \  |_ _| \ | |_   _|
    ;~  \ \ /\ / /| |\/| |   | |_) / _ \  | ||  \| | | |
    ;~   \ V  V / | |  | |   |  __/ ___ \ | || |\  | | |
    ;~    \_/\_/  |_|  |_|___|_| /_/   \_\___|_| \_| |_|
    ;~                  |_____|
    Func WM_PAINT($hWnd, $Msg, $wParam, $lParam)
    	_WinAPI_RedrawWindow($h_FormFotoSortNeu, 0, 0, $RDW_UPDATENOW)
    	_GDIPlus_GraphicsDrawImage($h_Graphic, $h_Bitmap, 0, 0)
    	_WinAPI_RedrawWindow($h_FormFotoSortNeu, 0, 0, $RDW_VALIDATE)
    	Return $GUI_RUNDEFMSG
    EndFunc   ;==>WM_PAINT
    ; ###############################################################################################################################################################################################
    ;~ __        ____  __     ____ ___ __________
    ;~ \ \      / /  \/  |   / ___|_ _|__  / ____|
    ;~  \ \ /\ / /| |\/| |   \___ \| |  / /|  _|
    ;~   \ V  V / | |  | |    ___) | | / /_| |___
    ;~    \_/\_/  |_|  |_|___|____/___/____|_____|
    ;~                  |_____|
    ; Dient im Moment nur dazu die StatusBar unten nach einer Größenänderung wieder anzupassen
    Func WM_SIZE($hWnd, $iMsg, $iwParam, $ilParam)
        _GUICtrlStatusBar_Resize($id_StatusBar)
    
    
    	; Ggf den + Button deaktivieren:
    	Local $a_GroupSize = ControlGetPos($h_FormFotoSortNeu, "", $id_GroupTargetDirectories)
    	If (($a_id_TargetDirectories[0][0] + 1) * $i_Distance) >= ($a_GroupSize[3] - $i_Distance) Then
    		GUICtrlSetState($id_ButtonAddTargetDirectory, $GUI_DISABLE)
    	Else
    		GUICtrlSetState($id_ButtonAddTargetDirectory, $GUI_ENABLE)
    	EndIf
    	If (($a_id_TargetDirectories[0][0] + 1) * $i_Distance) >= $a_GroupSize[3] Then
    		_Folder_Remove()
    	EndIf
        Return $GUI_RUNDEFMSG
    EndFunc   ;==>MY_WM_SIZE
    ;~ ###############################################################################################################################################################################################
    #EndRegion Funktionen
    
    
    
    
    #Region GUI-FormFotoSortNeu
    ; ###############################################################################################################################################################################################
    ;    ######   ##     ## ####
    ;   ##    ##  ##     ##  ##
    ;   ##        ##     ##  ##
    ;   ##   #### ##     ##  ##
    ;   ##    ##  ##     ##  ##
    ;   ##    ##  ##     ##  ##
    ;    ######    #######  ####
    ; ###############################################################################################################################################################################################
    
    
    ; Das Fenster an sich erstellen. Die Größenwerte 1009 und 730 ist die nutzbare Innenfläche ohne Ränder und Titelleiste (deren Größe von der Windowsversion abhängt)
    ; Als Styles wurden folgende gewählt:
    ; $GUI_SS_DEFAULT_GUI: 	beinhaltet die Styles $WS_MINIMIZEBOX, $WS_CAPTION, $WS_POPUP und $WS_SYSMENU
    ; $WS_MINIMIZEBOX    : Fenster hat eine Minimieren-Schaltfläche
    ; $WS_CAPTION        : Es gibt eine Titelzeile oben (Steht oft der Programmname drin)
    ; $WS_POPUP          : Macht ein Popup-Fenster (keine Ahnung wazu das hier drin ist)
    ; $WS_SYSMENU        : Erlaubt das Menü das kommt wenn man oben links auf das Programsymbol in der Titelleiste klickt
    ; $WS_MAXIMIZEBOX    : Fenster hat eine Maximieren-Schaltfläche
    ; $WS_SIZEBOX        : Fenster hat einen Rahmen zur Größenänderung
    ; $WS_TABSTOP        : Die Controls im Fenster können per Tabulator-Taste durchgeschaltet werden
    ; Als Extended Styles wurden folgende gewählt:
    ; $WS_EX_ACCEPTFILES : Man darf Dateien auf Edit-Controls ziehen, die bekommen dann den Dateinamen
    $h_FormFotoSortNeu = GUICreate("FotoSortNeu", 1009, 730, -1, -1, BitOR($GUI_SS_DEFAULT_GUI,$WS_MAXIMIZEBOX,$WS_SIZEBOX,$WS_TABSTOP), $WS_EX_ACCEPTFILES)
    ; Schriftart setzen - diese wird von allen Controls verwendet sofern nicht etwas anderes an diesen angegeben werden
    GUISetFont(10, 400, 0, "Verdana")
    GUISetBkColor(0xC8C8C8)
    GUISetOnEvent($GUI_EVENT_CLOSE, "id_FormFotoSortNeuClose")
    GUISetOnEvent($GUI_EVENT_RESTORE, "id_FormFotoSortNeuRestore")
    
    
    
    
    ; Die Statusbar unten erstellen
    $id_StatusBar = _GUICtrlStatusBar_Create($h_FormFotoSortNeu, -1, "", BitOR($WS_VISIBLE,$WS_CHILD,$WS_BORDER))
    ; Die Größe der 3 Abschnitte, -1 = bis zum Ende
    Local $id_StatusBar_PartsWidth[3] = [500, 800, -1]
    _GUICtrlStatusBar_SetParts($id_StatusBar, $id_StatusBar_PartsWidth)
    ;Anfangstext in die einzelnen Abschnitte der Statusbar setzen
    _GUICtrlStatusBar_SetText($id_StatusBar, "Status", 0)
    _GUICtrlStatusBar_SetText($id_StatusBar, "Bild 0 von 0", 1)
    _GUICtrlStatusBar_SetText($id_StatusBar, "Bildinfos", 2)
    _GUICtrlStatusBar_SetMinHeight($id_StatusBar, 22)
    
    
    ; Die Gruppen oben links mit dem Pfad zum aktuellen Ordner erstellen
    $id_GroupQuellverzeichnis = GUICtrlCreateGroup(" Quellverzeichnis: ", 5, 8, 514, 68)
    ; Die Gruppe - und alle Controls in dieser - heften wir an den linken + oberen + rechten Rand - damit die bei Größenänderungen oben bleibt, sich aber in die Breite zieht. Die Höhe ist gesperrt
    GUICtrlSetResizing($id_GroupQuellverzeichnis, $GUI_DOCKLEFT+$GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKHEIGHT)
    ; Das Input-Feld, ist Readonly, aktzeptiert Drag'n Drop
    $id_InputSourceDirectory = GUICtrlCreateInput("", 13, 28, 462, 25, BitOR($ES_READONLY,$ES_LEFT, $ES_AUTOHSCROLL), BitOR($WS_EX_CLIENTEDGE, $WS_EX_ACCEPTFILES))
    GUICtrlSetFont($id_InputSourceDirectory, 11, 400, 0, "Arial")
    GUICtrlSetBkColor($id_InputSourceDirectory, 0xFFFFE1)
    ; Das Edit heften wir links, rechts und oben fest - damit es sich nicht in der Höhe ändert aber in die Breite geht. Höhe ist wieder gesperrt
    GUICtrlSetResizing($id_InputSourceDirectory, $GUI_DOCKLEFT+$GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKHEIGHT)
    ; Damit das Feld Drag'n Drop annimmt (muss zusätzlich zum Extended-Style gesetzt werden)
    GUICtrlSetState($id_InputSourceDirectory, $GUI_DROPACCEPTED)
    ; Der Button für die Auswahl der Datei
    $id_ButtonSelectSourceDirectory = GUICtrlCreateButton("...", 477, 28, 33, 25)
    ; Den heften wir nur oben und rechts an - damit der mit nach rechts wandert wenn wir die GUI vergößern. Höhe und Breite ist gesperrt
    GUICtrlSetResizing($id_ButtonSelectSourceDirectory, $GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)
    GUICtrlSetOnEvent($id_ButtonSelectSourceDirectory, "_Folder_Select")
    ; Und noch die Checkbox für die rekursive Suche
    $id_CheckboxScanFolderRecursive = GUICtrlCreateCheckbox("inklusive Unterordner (Rekursiv)", 13, 56, 225, 17)
    ; Die heften wir oben und links an - so bleibt die einfach auf der Stelle stehen, Höhe und Breite gesperrt
    GUICtrlSetResizing($id_CheckboxScanFolderRecursive, $GUI_DOCKLEFT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)
    ; Gruppe ist fertig, also schließen
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    
    
    ; Nun die verfügbaren Bildformate. Wie bei Oscar keine feste Liste sondern alles das was GDIPlus so kann.
    $id_GroupFileFormats = GUICtrlCreateGroup(" Dateiformate: ", 528, 8, 473, 68)
    ; Die Group ist fest in der Größe und oben sowie rechts angeheftet
    GUICtrlSetResizing($id_GroupFileFormats, $GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)
    ; Um GDIPlus nutzen zu können müssen wir es starten:
    _GDIPlus_Startup()
    ; und die verfügbaren Decoders abfragen. Hinweis: Den für GIF werden wir später nicht nutzen sondern einen anderen der mit animierten GIF umgehen kann.
    $aGDIPlusDecoders = _GDIPlus_Decoders()
    ; $aGDIPlusDecoders sieht jetzt - gekürzt - wie folgt aus:
    ; $aGDIPlusDecoders[0][0] = Anzahl der verfügbaren Decoders
    ; $aGDIPlusDecoders[x][5] = Der Name des Dateiformates, z.B. BMP
    ; Die ControlIds der ganzen Checkboxen packen wir in ein Array. Das ist um 1 größer als nötig - wir packen noch eine Option "Alle" dazu.
    ; Oscar hat das als Popup/Rechtsklick Menü gemacht. Das hatte ich erst gefunden als ich es im Quellcode gesehen hatte.
    ReDim $a_id_CheckboxFileformat[ $aGDIPlusDecoders[0][0] + 1 ]
    ; Die erste Checkbox mit "Alle" kommte oben links in die Group. Alle sind 65 lang und 17 hoch
    $a_id_CheckboxFileformat[0] = GUICtrlCreateCheckbox("Alle", 536, 28, 65, 17)
    GUICtrlSetOnEvent($a_id_CheckboxFileformat[0], "_CheckboxFileformat")
    GUICtrlSetResizing($a_id_CheckboxFileformat[0], $GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)
    ; Die erste Reihe kommt auf 28, die zweite Reihe auf 52
    ; Abstand Horizontal sind 72
    For $i = 1 To $aGDIPlusDecoders[0][0] Step 1
    	; So die Formel habe ich mir bei Oscar abgeschaut - und musste erst einmal überlegen was er da macht
    	$a_id_CheckboxFileformat[$i] = GUICtrlCreateCheckbox($aGDIPlusDecoders[$i][5], 614 + Mod($i - 1, 5) * 78, 28 + Int(($i - 1) / 5) * 24, 65, 17)
    	; X: 	614 + Mod($i - 1, 5) * 72
    	; 614 Pixel von links fangen wir an, dazu addieren wir das Ergebnis der rechten Berechnung (Punkt vor Strichrechnung!)
    	; Mod($i - 1, 5) ergibt - bei $i 1 bis 8 - die Zahlenfolge 0 1 2 3 4 0 1 2
    	; Und den Wert Multiplizieren wir immer mit 72, dem gewünschten Abstand der Spalten
    	; Y: 	28 + Int(($i - 1) / 5) * 24
    	; 28 Pixel von oben ist die erste Reihe
    	; ($i - 1) / 5 liefert und die Zahlenfolge 0 0.2 0.4 0.8 1 1.2 1.4 usw.
    	; Durch Int() bekommen wir nur den Teil vor dem . (ohne Runden) also 0 0 0 0 1 1 1, also 4 mal 0 und dann 1 (und 2, 3 je nach Größe von $i)
    	; Und das dann mal 24, denn bei 28 + 24 = 52 soll die 2 Zeile hin
    
    
    	; Die Checkboxen haben alle eine feste Größe und werden oben und rechts angeheftet
    	GUICtrlSetResizing($a_id_CheckboxFileformat[$i], $GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)
    	; Und noch die Funktion die aufgerufen werden soll wenn sich ein Wert ändert:
    	GUICtrlSetOnEvent($a_id_CheckboxFileformat[$i], "_CheckboxFileformat")
    	; und der Tooltip
    	GUICtrlSetTip($a_id_CheckboxFileformat[$i], "Alle Dateien mit Dateiendung: " & StringLower($aGDIPlusDecoders[$i][6]))
    
    
    Next
    ; Und die Gruppe ist komplett, also zumachen
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    
    
    
    
    ; Die Gruppe mit den Zielverzeichnissen. Ein Grund warum ich dieses Programm neu geschrieben habe. Ich brauchte mehr davon und der Platz des Bildschirmes sollte besser ausgenutzt werden
    ; Die Anzahl der Zielverzeichniss ist dynamisch
    ; Group anlegen
    $id_GroupTargetDirectories = GUICtrlCreateGroup(" Zielverzeichnisse (1..1): ", 528, 176, 473, 441)
    ; Die Group rechts, oben und unten angeheftet. Die Breite ist fix, die Höhe nicht. Dadurch wird die Gruppe - als einzige - größer wenn das fenster vergrößert wird
    GUICtrlSetResizing($id_GroupTargetDirectories, $GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKBOTTOM+$GUI_DOCKWIDTH)
    
    
    
    
    ; So, nun brauchen wir pro Zielverzeichnis: 1x Button kopieren, 1x Button verschieben, 1x Input mit dem Pfad, 1x Input zur Pfadauswahl
    ; das machen wir natürlich mit einem Array das wie folgt aussieht:
    ; $a_id_TargetDirectories[2][5]	; [0][0] = Anzahl
    								; [x][1] = Button kopieren
    								; [x][2] = Butten verschieben
    								; [x][3] = Input
    								; [x][4] = Pfadauswahl
    ; Eine Zeile gibt es immer!
    $a_id_TargetDirectories[0][0] = 1
    
    
    ; Den Button für kopieren
    $a_id_TargetDirectories[1][1] = GUICtrlCreateButton("1", 536, 200, 33, 25)
    GUICtrlSetOnEvent($a_id_TargetDirectories[1][1], "_Picture_Copy")
    ; Diesen und die nachfolgenden Buttons heften wir Rechts und oben an, Größe ist fix
    GUICtrlSetResizing($a_id_TargetDirectories[1][1], $GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)
    GUICtrlSetTip($a_id_TargetDirectories[1][1], "Datei kopieren")
    
    
    ; Den Button für verschieben
    $a_id_TargetDirectories[1][2] = GUICtrlCreateButton("»", 568, 200, 33, 25)
    GUICtrlSetOnEvent($a_id_TargetDirectories[1][2], "_Picture_Move")
    GUICtrlSetResizing($a_id_TargetDirectories[1][2], $GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)
    GUICtrlSetTip($a_id_TargetDirectories[1][2], "Datei verschieben")
    
    
    ; Das Input mit dem Pfad
    $a_id_TargetDirectories[1][3] = GUICtrlCreateInput("", 603, 200, 354, 25, BitOR($ES_READONLY,$ES_LEFT, $ES_AUTOHSCROLL), BitOR($WS_EX_CLIENTEDGE, $WS_EX_ACCEPTFILES))
    GUICtrlSetFont($a_id_TargetDirectories[1][3], 11, 400, 0, "Arial")
    GUICtrlSetBkColor($a_id_TargetDirectories[1][3], 0xFFFFE1)
    GUICtrlSetResizing($a_id_TargetDirectories[1][3], $GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)
    ; Damit das Feld Drag'n Drop annimmt (muss zusätzlich zum Extended-Style gesetzt werden)
    GUICtrlSetState($a_id_TargetDirectories[1][3], $GUI_DROPACCEPTED)
    
    
    ; Und noch der Button für die Pfadauswahl
    $a_id_TargetDirectories[1][4] = GUICtrlCreateButton("...", 960, 200, 33, 25)
    GUICtrlSetOnEvent($a_id_TargetDirectories[1][4], "_Folder_Select")
    GUICtrlSetResizing($a_id_TargetDirectories[1][4], $GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)
    GUICtrlSetTip($a_id_TargetDirectories[1][4], "Pfad wählen")
    
    
    ; Unterhalb der Zeile kommen noch 2 Buttons für das Hinzufügen und Entfernen weiterer Zeilen hinzu
    $id_ButtonAddTargetDirectory = GUICtrlCreateButton("+", 536, 232, 33, 25)
    GUICtrlSetOnEvent($id_ButtonAddTargetDirectory, "_Folder_Add")
    GUICtrlSetResizing($id_ButtonAddTargetDirectory, $GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)
    GUICtrlSetTip($id_ButtonAddTargetDirectory, "Einen Pfad hinzufügen")
    $id_ButtonRemoveTargetDirectory = GUICtrlCreateButton("-", 568, 232, 33, 25)
    GUICtrlSetOnEvent($id_ButtonRemoveTargetDirectory, "_Folder_Remove")
    GUICtrlSetResizing($id_ButtonRemoveTargetDirectory, $GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)
    GUICtrlSetTip($id_ButtonRemoveTargetDirectory, "Den vorstehenden Pfad entfernen")
    ; - wird deaktiviert, haben im Moment ja nur eine Zeile
    GUICtrlSetState($id_ButtonRemoveTargetDirectory, $GUI_DISABLE)
    
    
    ; Und auch diese Gruppe ist fertig
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    
    
    
    
    ; Die Gruppe mit den Optionen für doppelte / schon vorhandene Dateien
    $id_GroupFileExists = GUICtrlCreateGroup(" Datei bereits vorhanden ", 528, 80, 473, 90)
    GUICtrlSetResizing($id_GroupFileExists, $GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)
    $id_RadioOverwrite = GUICtrlCreateRadio("vorhandene Datei überschreiben", 536, 100, 241, 17)
    GUICtrlSetResizing($id_RadioOverwrite, $GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)
    $id_RadioAddSuffix = GUICtrlCreateRadio("Suffix anhängen:", 536, 124, 137, 17)
    GUICtrlSetState($id_RadioAddSuffix, $GUI_CHECKED)
    GUICtrlSetResizing($id_RadioAddSuffix, $GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)
    $id_InputSuffix = GUICtrlCreateInput("_####", 674, 120, 89, 25, BitOR($GUI_SS_DEFAULT_INPUT,$ES_CENTER))
    GUICtrlSetFont($id_InputSuffix, 11, 400, 0, "Arial")
    GUICtrlSetResizing($id_InputSuffix, $GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)
    $id_RadioAskOverwrite = GUICtrlCreateRadio("Nachfragen", 536, 148, 241, 17)
    GUICtrlSetResizing($id_RadioAskOverwrite, $GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)
    $id_CheckboxOnlyIfDifferent = GUICtrlCreateCheckbox("Nur wenn nicht identisch", 784, 100, 209, 17)
    GUICtrlSetState($id_CheckboxOnlyIfDifferent, $GUI_CHECKED)
    GUICtrlSetResizing($id_CheckboxOnlyIfDifferent, $GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)
    $id_LabelCountingNumber = GUICtrlCreateLabel("# = laufende Nummer", 784, 124, 146, 20)
    GUICtrlSetResizing($id_LabelCountingNumber, $GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    
    
    
    
    Global $a_id_Tools[8][2] = [ [ "DEL", 0 ], [ "ROT", 0 ], [ "FOLD", 0 ], [ "D", 0 ], [ "E", 0 ], [ "F", 0 ], [ "G", 0 ], [ "BKG", 0 ] ]
    
    
    ; Die Gruppe mit den Werkzeugen
    $id_GroupTools = GUICtrlCreateGroup(" Werkzeuge ", 528, 624, 473, 76)
    GUICtrlSetResizing($id_GroupTools, $GUI_DOCKRIGHT+$GUI_DOCKBOTTOM+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)
    ; Und die Buttons selbst - sind noch ein paar zuviel in Reserve
    For $i = 0 To (UBound($a_id_Tools) - 1) Step 1
    	$a_id_Tools[$i][1] = GUICtrlCreateButton($a_id_Tools[$i][0], 536 + ($i * 58), 644, 48, 48)
    	GUICtrlSetResizing($a_id_Tools[$i][1], $GUI_DOCKRIGHT+$GUI_DOCKBOTTOM+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)
    	GUICtrlSetOnEvent($a_id_Tools[$i][1], "_Tools")
    Next
    ; Und die Gruppe ist fertig
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    
    
    ; Die Schaltflächen für vor / zurück etc. + das Input
    $id_ButtonPicGoToFirst = GUICtrlCreateButton("Start", 5, 640, 50, 25)
    GUICtrlSetResizing($id_ButtonPicGoToFirst, $GUI_DOCKLEFT+$GUI_DOCKBOTTOM+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)
    $id_ButtonPicBack100 = GUICtrlCreateButton("-100", 60, 640, 50, 25)
    GUICtrlSetResizing($id_ButtonPicBack100, $GUI_DOCKLEFT+$GUI_DOCKBOTTOM+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)
    $id_ButtonPicBack10 = GUICtrlCreateButton("-10", 115, 640, 50, 25)
    GUICtrlSetResizing($id_ButtonPicBack10, $GUI_DOCKLEFT+$GUI_DOCKBOTTOM+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)
    $id_ButtonPicBack1 = GUICtrlCreateButton("<", 170, 640, 50, 25)
    GUICtrlSetResizing($id_ButtonPicBack1, $GUI_DOCKLEFT+$GUI_DOCKBOTTOM+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)
    $id_InputPicNumber = GUICtrlCreateInput("9999", 225, 640, 75, 25, BitOR($GUI_SS_DEFAULT_INPUT,$ES_CENTER))
    GUICtrlSetFont($id_InputPicNumber, 11, 400, 0, "Arial")
    GUICtrlSetResizing($id_InputPicNumber, $GUI_DOCKLEFT+$GUI_DOCKRIGHT+$GUI_DOCKBOTTOM+$GUI_DOCKHEIGHT)
    $id_ButtonForward1 = GUICtrlCreateButton(">", 305, 640, 50, 25)
    GUICtrlSetResizing($id_ButtonForward1, $GUI_DOCKRIGHT+$GUI_DOCKBOTTOM+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)
    $id_ButtonForward10 = GUICtrlCreateButton("+10", 360, 640, 50, 25)
    GUICtrlSetResizing($id_ButtonForward10, $GUI_DOCKRIGHT+$GUI_DOCKBOTTOM+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)
    $id_ButtonForward100 = GUICtrlCreateButton("+100", 415, 640, 50, 25)
    GUICtrlSetResizing($id_ButtonForward100, $GUI_DOCKRIGHT+$GUI_DOCKBOTTOM+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)
    $id_ButtonGoToLast = GUICtrlCreateButton("Ende", 470, 640, 50, 25)
    GUICtrlSetResizing($id_ButtonGoToLast, $GUI_DOCKRIGHT+$GUI_DOCKBOTTOM+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)
    $id_CheckboxPictureFitSize = GUICtrlCreateCheckbox("Größe anpassen", 5, 685, 137, 17)
    GUICtrlSetState($id_CheckboxPictureFitSize, $GUI_CHECKED)
    GUICtrlSetResizing($id_CheckboxPictureFitSize, $GUI_DOCKLEFT+$GUI_DOCKBOTTOM+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)
    
    
    
    
    GUISetState(@SW_SHOW, $h_FormFotoSortNeu)
    ; Platzhalter für die Vorschaugrafik
    ;~ $id_Picture = GUICtrlCreatePic( @ScriptDir & "\Test.jpg", 5, 88, 514, 530)
    ;~ GUICtrlSetResizing($id_Picture, $GUI_DOCKLEFT+$GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKBOTTOM)
    
    
    ; Die Vorschau-Grafik. Stammt nahezu 1:1 aus Oscars Original
    $a_FormFotoSortNew_Size = WinGetPos($h_FormFotoSortNeu)
    WinMove($h_FormFotoSortNeu, "", 0, 0, @DesktopWidth, @DesktopHeight)
    $h_Graphic = _GDIPlus_GraphicsCreateFromHWND($h_FormFotoSortNeu)
    WinMove($h_FormFotoSortNeu, "", $a_FormFotoSortNew_Size[0], $a_FormFotoSortNew_Size[1], $a_FormFotoSortNew_Size[2], $a_FormFotoSortNew_Size[3])
    _GDIPlus_GraphicsSetSmoothingMode($h_Graphic, 2)
    
    
    $h_Bitmap = _GDIPlus_BitmapCreateFromGraphics($i_GuiWidth, $i_GuiHeight, $h_Graphic)
    ;~ $h_Bitmap = _GDIPlus_BitmapCreateFromGraphics(@DesktopWidth, @DesktopHeight, $h_Graphic)
    $h_GraphicBuff = _GDIPlus_ImageGetGraphicsContext($h_Bitmap)
    $i_BgColor = 0
    
    
    $a_h_Brush[0] = _GDIPlus_BrushCreateSolid(0xFFECECEC)
    $a_h_Brush[1] = _GDIPlus_BrushCreateSolid(0xFFDFDFDF)
    $a_h_Brush[2] = _GDIPlus_BrushCreateSolid(0xFF000000)
    $a_h_Brush[3] = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)
    $h_Texture = _CreatePatternTexture($i_PreviewLeft, $i_PreviewTop, $i_PreviewWidth, $i_PreviewHeight)
    
    
    _GDIPlus_GraphicsDrawRect($h_GraphicBuff, $i_PreviewLeft - 2, $i_PreviewTop - 2, $i_PreviewWidth + 3, $i_PreviewHeight + 3)
    _GDIPlus_GraphicsDrawRect($h_GraphicBuff, $i_PreviewLeft - 1, $i_PreviewTop - 1, $i_PreviewWidth + 1, $i_PreviewHeight + 1)
    _DrawBgColor($i_PreviewLeft, $i_PreviewTop, $i_PreviewWidth, $i_PreviewHeight)
    _GDIPlus_GraphicsDrawImage($h_Graphic, $h_Bitmap, 0, 0)
    WinMove($h_FormFotoSortNeu, "", $a_FormFotoSortNew_Size[0], $a_FormFotoSortNew_Size[1], $a_FormFotoSortNew_Size[2], $a_FormFotoSortNew_Size[3])
    
    
    ; Kümmert sich um das Zeichnen/Refresh der Vorschau
    GUIRegisterMsg($WM_PAINT, 'WM_PAINT')
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    #EndRegion GUI-FormFotoSortNeu
    
    
    
    
    #Region Startup
    ; ###############################################################################################################################################################################################
    ;    ######  ########    ###    ########  ######## ##     ## ########
    ;   ##    ##    ##      ## ##   ##     ##    ##    ##     ## ##     ##
    ;   ##          ##     ##   ##  ##     ##    ##    ##     ## ##     ##
    ;    ######     ##    ##     ## ########     ##    ##     ## ########
    ;         ##    ##    ######### ##   ##      ##    ##     ## ##
    ;   ##    ##    ##    ##     ## ##    ##     ##    ##     ## ##
    ;    ######     ##    ##     ## ##     ##    ##     #######  ##
    ; ###############################################################################################################################################################################################
    
    
    
    
    ; Die Statusbar ist nicht wie die anderen Controls an den Rändern "angeklebt".
    ; Wir müssen nach jeder Größenanderung eine Funktion aufrufen welche die Statusbar wieder anpasst
    GUIRegisterMsg($WM_SIZE, "WM_SIZE")
    
    
    
    
    ; Die GUI soll einen minimale Größe von 1024 x 768 nicht unterschreiten.
    ; Die Lösung:
    ; 1. Wir holen uns die Anfangsgröße (sollte 1024 x 768 sein, Bei GUICreate steht die Größe der inneren Nutzfläche)
    $a_FormFotoSortNew_Size = WinGetPos($h_FormFotoSortNeu)
    ; 2. Wir setzen die erlaubten minimal und maximal Werte
    $i_FormFotoSortNew_SizeMinWidth = $a_FormFotoSortNew_Size[2]
    $i_FormFotoSortNew_SizeMinHeight = $a_FormFotoSortNew_Size[3]
    ; Als maximale Werte nehmen wir die des Desktops
    $i_FormFotoSortNew_SizeMaxWidth = @DesktopWidth
    $i_FormFotoSortNew_SizeMaxHeight = @DesktopHeight
    ; 3. Wir registrieren eine Funktion welche dafür sorgt das die Grenzwerte eingehalten werden, diese wird von Windows/AutoIt automatisch aufgerufen
    GUIRegisterMsg($WM_GETMINMAXINFO, "WM_GETMINMAXINFO")
    
    
    
    
    ; Funktion Registrieren die reagiert wenn per Drag'n Drop eine Datei auf die GUI gezogen wird
    GUISetOnEvent($GUI_EVENT_DROPPED, "GUI_EVENT_DROPPED", $h_FormFotoSortNeu)
    #EndRegion Startup
    #Region Main
    ; ###############################################################################################################################################################################################
    ;   ##     ##    ###    ##     ## ########  ########  ######   ######  ##     ## ##       ######## #### ######## ########
    ;   ##     ##   ## ##   ##     ## ##     ##    ##    ##    ## ##    ## ##     ## ##       ##        ##  ##       ##
    ;   ##     ##  ##   ##  ##     ## ##     ##    ##    ##       ##       ##     ## ##       ##        ##  ##       ##
    ;   ######### ##     ## ##     ## ########     ##     ######  ##       ######### ##       ######    ##  ######   ######
    ;   ##     ## ######### ##     ## ##           ##          ## ##       ##     ## ##       ##        ##  ##       ##
    ;   ##     ## ##     ## ##     ## ##           ##    ##    ## ##    ## ##     ## ##       ##        ##  ##       ##
    ;   ##     ## ##     ##  #######  ##           ##     ######   ######  ##     ## ######## ######## #### ##       ########
    ; ###############################################################################################################################################################################################
    While 1
    	Sleep(100)
    WEnd
    #EndRegion Main
    Alles anzeigen

    Und als Datei: FotoSortNeu.au3

    BLinz

  • Parameterüber (cmdline) + _AD_RecursiveGetMemberOf

    • BLinz
    • 6. Juli 2017 um 12:57

    Noch ein Nachtrag:

    Du nutzt diesen Aufruf:

    AutoIt
    $alle_gruppen = _AD_RecursiveGetMemberOf($user, 10, 1, false)


    Mich stört das false - bei mir steht da 0:


    AutoIt
    Global $Gruppen_indirekt_TEMP = _AD_RecursiveGetMemberOf(@UserName, 10, 1, 0)

    ich habe mal in AD.au3 geschaut ... richtig wäre

    AutoIt
    $alle_gruppen = _AD_RecursiveGetMemberOf($user, 10, True, False)

    wobei im zweifel immer True nimmt. Bei mir ist es also völlig falsch und funktioniert nur zufällig wie ich es will

  • Parameterüber (cmdline) + _AD_RecursiveGetMemberOf

    • BLinz
    • 6. Juli 2017 um 12:49
    Zitat von BLinz

    Vielleicht ist dein Testbenutzer in keinen indirekten Gruppen.

    Probier mal _AD_GetUserGroups(), der listet die direkten Gruppen auf. Da sollte es immer eine geben.

    Bevor du dich daran vertiefst das es Zeichensatzproblem etc ist - _AD_RecursiveGetMemberOf() listet die indirekten Gruppen auf!

  • WMI Windows-Updates Dokumentation/ Kritische Windows-Updates über WMI abfragen

    • BLinz
    • 6. Juli 2017 um 11:41

    Aus dem verlinkten Microsoft-Artikel in Post #2:

    "BrowseOnly=1" finds updates that are considered optional.
    "BrowseOnly=0" finds updates that are not considered optional.

    Übersetzt:

    "BrowseOnly = 1" findet Updates, die als optional gelten.
    "BrowseOnly = 0" findet Updates, die nicht als optional gelten.

    Test doch mal mit

    AutoIt
    $searchResult = $updateSearcher.Search("IsInstalled=0 and Type='Software' and BrowseOnly=0")

    Dann gäbe es noch:
    "AutoSelectOnWebSites=1" finds updates that are flagged to be automatically selected by Windows Update.

    Das wäre die Alternative um nur wichtige zu finden. Deine Frage im Post #1 war nach Parametern. Unter https://msdn.microsoft.com/en-us/library/…6(v=vs.85).aspx findest du die satt.

  • Parameterüber (cmdline) + _AD_RecursiveGetMemberOf

    • BLinz
    • 6. Juli 2017 um 10:44

    Ich habe auch mal so etwas gebaut - zum Vergleich:


    AutoIt
    Global $Gruppen_indirekt[1]
    Global $Gruppen_direkt[1]
    
    
    ; ###################################################################################
    ; In dieser Function findet die eigentlich Ermittlung der zugehörigen Gruppen statt
    ; Dies geschicht in 2 Schritten:
    ; 1. die direkten Gruppen werden ermittelt (was leicht war)
    ; 2. Alle Gruppen in der der Benutzer indirekt Mitglied ist werden ermittelt (was schwerer war)
    ; Die Gruppen werden in 2 Globalen Variablen abgelegt. Hier wird noch mit TEMP Variablen gearbeitet - der Compiler hatte gemeckert was
    ; die Definitionen der Variablen angeht wenn ich es direkt mit den Variablen gemacht habe, deshalb der Zwischenschritt
    Func _GruppenErmitteln()
    	_AD_Open()
    	If @error Then Exit _MeldungAusgebenConsole("Konnte keinen Kontakt zum AD herstellen")
    	; Liste der direkten Gruppenmitgliedschaften
    	$Gruppen_direkt[0] = 0
    	Global $Gruppen_direkt_TEMP = _AD_GetUserGroups(@UserName)
    	If @error > 0 Then
    		_MeldungAusgebenConsole("Aktueller Benutzer ist scheinbar in keinerlei Gruppen! (direkt)")
    	Else
    		For $i = 1 To $Gruppen_direkt_TEMP[0]
    			$Gruppen_direkt_TEMP[$i] = _AD_FQDNToSamAccountName($Gruppen_direkt_TEMP[$i])
    		Next
    		_ArraySort($Gruppen_direkt_TEMP, 0, 1)
    		$Gruppen_direkt[0] = $Gruppen_direkt_TEMP[0]
    		For $i = 1 To $Gruppen_direkt_TEMP[0]
    			_ArrayAdd($Gruppen_direkt, $Gruppen_direkt_TEMP[$i])
    		Next
    	EndIf
    	; Liste der indirekten Gruppenmitgliedschaften
    	$Gruppen_indirekt[0] = 0
    	Global $Gruppen_indirekt_TEMP = _AD_RecursiveGetMemberOf(@UserName, 10, 1, 0)
    	If @error > 0 Then
    		_MeldungAusgebenConsole("Aktueller Benutzer ist scheinbar in keinerlei Gruppen! (indirekt)")
    	Else
    		_ArraySort($Gruppen_indirekt_TEMP, 0, 1)
    		For $i = 1 To $Gruppen_indirekt_TEMP[0]
    			If StringInStr($Gruppen_indirekt_TEMP[$i], "|") > 0 Then
    				If (StringLeft($Gruppen_indirekt_TEMP[$i], StringInStr($Gruppen_indirekt_TEMP[$i], "|") - 1)) <> (StringLeft($Gruppen_indirekt_TEMP[$i - 1], StringInStr($Gruppen_indirekt_TEMP[$i - 1], "|") - 1)) Then
    					$Gruppen_indirekt[0] = $Gruppen_indirekt[0] + 1
    					_ArrayAdd($Gruppen_indirekt, StringLeft($Gruppen_indirekt_TEMP[$i], StringInStr($Gruppen_indirekt_TEMP[$i], "|") - 1))
    				EndIf
    			EndIf
    		Next
    		_ArraySort($Gruppen_indirekt, 0, 1)
    	EndIf
    	_AD_Close()
    EndFunc   ;==>_GruppenErmitteln
    Alles anzeigen

    Wenn ich mir mein eigenes Skript so ansehe dann stelle ich fest, das die Funktion $Gruppen_indirekt_TEMP = _AD_RecursiveGetMemberOf(@UserName, 10, 1, 0) wohl nur die indirekten Gruppenmitgliedschaften findet.
    Vielleicht ist dein Testbenutzer in keinen indirekten Gruppen.

    Probier mal _AD_GetUserGroups(), der listet die direkten Gruppen auf. Da sollte es immer eine geben.

    Gruß,
    BLinz

    PS: Das stammt aus meinem Programm ifmemberdeluxe , bei Bedarf könnten ich den ganzen Quellcode bereit stellen.
    Es hat eine Testfunktion: Testfunktionen die aber immer für den gerade angemeldeten Benutzer gelten

  • WMI Windows-Updates Dokumentation/ Kritische Windows-Updates über WMI abfragen

    • BLinz
    • 6. Juli 2017 um 10:35

    Ich habe gerade mal bei mir nachgesehen - ich habe mal für ein Zabbix-Monitoring auch so etwas gebaut.

    Meine Abfrage nutzt


    AutoIt
    $searchResult = $updateSearcher.Search("IsInstalled=0 and IsHidden=0 and Type='Software'")

    Und hat eigentlich nur die wichtigen, nicht die optionalen Updates angezeigt.

    Google hat mir das ausgespuckt: https://msdn.microsoft.com/en-us/library/…6(v=vs.85).aspx
    Das ist der MS-Artikel mit den möglichen Parametern.

    Jetzt kommt ein ABER ...

    Ich rate inzwischen allen Kunden und jedem von der Nutzung dieser Funktion ab. Die regelmäßige Abfrage (1 bis 2 mal am Tag) hat uns nur Ärger gebracht.
    Erst läuft es eine Weile ... und dann erwischt man die Server wie diese Stundenlang bei 100% CPU braten weil sich der Prozess dazu ... ich schätze mal aufhängt.
    Insbesondere Windows Server 2008 R2 scheint da sehr anfällig zu sein.

    Und nein, ich habe auch keine bessere Methode dafür gefunden (bisher).

    Das Problem ist das diese Abfrage die Suche nach Updates aktiv anstößt. Er schaut nicht einfach was Windows sowieso schon weis (also die Anzeige im Windows Update Dialog).
    Mir würde die Daten von dort schon reichen (wo auch immer die ablegt sind)

    Gruß,
    BLinz

  • Do Sleep(100) Until $GotVariable ;<~ geht trotz False aus der Schleife

    • BLinz
    • 5. Juli 2017 um 20:54

    hast du das mit den unterschiedlichen IDs getestet? Das die sich nicht in der richtigen Reihenfolge melden kann schon sein, die laufen halt alle 4 und quatschen durcheinander.
    Wenn das nicht hilft kannst du ja ach die Unique-ID pro Prozess einmalig machen (häng halt eine Zahl dran)

  • Do Sleep(100) Until $GotVariable ;<~ geht trotz False aus der Schleife

    • BLinz
    • 5. Juli 2017 um 18:39

    Nachtrag: Ich habe bei mir die Abfrage der Nachrichten in eine eigene Funktion gepackt die per AdLibRegister regelmäßig aufgerufen wird.
    Und arbeite im GUIOnEvent-Modus.

    Ich kann mich irren, aber dein Hauptprogramm läuft nur so lange bis es eine Nachricht gab? Die Worker haben ja ein While 1

    ich sollte genauer lesen, es wartet bis sich jeder gemeldet hat

  • Do Sleep(100) Until $GotVariable ;<~ geht trotz False aus der Schleife

    • BLinz
    • 5. Juli 2017 um 18:34

    Also ich hatte das bei ExchangeVariables so interpretiert das du für jede $ID dein eigenes Startup brauchen würdest.
    Im Main machst du nur ein Startup für 0, die anderen 4 Version nutzen 1 bis 4

    Bei mir laufen bis zu 10 x 2 Programme die sich so unterhalten auf einem Server (Terminalserver mit verschiedenen Benutzern),
    Die Unique-ID ist bei allen gleich,
    Also $ID nutze ich die PID von Run() bzw. ShellExecute. Da es jede PID nur einmal gibt unterhalten sich nur die richtigen Programme des jeweiligen Benutzers

    Dein Vorgehen sollte auch gehen - aber ich meine du musst es so machen:

    AutoIt
    For $i = 1 To 4 Step 1
    		ShellExecute(@ScriptFullPath, $i, @ScriptDir, '', @SW_SHOW) ;Execute dich selbst 4 mal mit Parameter 1-4
    		_ExchangeVariables_Startup($i, 'MAIN', '_VarMsg')
    	Next
  • FotoSort

    • BLinz
    • 5. Juli 2017 um 18:23

    Das war jetzt zu einfach ...

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™