#region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Res_Fileversion=0.6
#AutoIt3Wrapper_Res_LegalCopyright=© by Keyle
#endregion ;**** Directives created by AutoIt3Wrapper_GUI ****
#cs ----------------------------------------------------------------------------

	ISO-Creator made by Keyle
	Version 0.6
	mkisofs.exe ist Teil des CDRTools

#ce ----------------------------------------------------------------------------

#include <GUIListView.au3>
#include <GUIConstants.au3>
#include <WindowsConstants.au3>
#include <GDIPlus.au3>
#include <Constants.au3>
#include <misc.au3>
#include <ButtonConstants.au3>

Opt("GUIOnEventMode", 1)

$version = "0.6"
$S_Dir_File = "Dir"
$GUI_Title = "ISO-Creator   © by Keyle"
$MB = 0
$ISO_Format_Groesse = "DVD"
$SendTo_Dir = RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","SendTo")
Global $WM_DROPFILES = 0x233
Global $gaDropFiles[1]
Global $AS_Dir_Files_2_Add[1] = [""], $AS_Dir_Files_2_Add_Size[1] = [""]

If _Singleton("RunningCheck", 1) = 0 And $cmdline[0] > 0 Then
	$Send_cmdline = _ArrayToString($cmdline)
	_SendCopyDataString(-1, WinGetHandle("ISO-Creator   © by Keyle"), $Send_cmdline)
	Exit
EndIf

$GUI_ISO = GUICreate($GUI_Title, 511, 630, 192, 124, -1, $WS_EX_ACCEPTFILES)
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
GUICtrlCreateLabel("Bitte Ordner oder Dateien auswählen die ins ISO hinzugefügt werden soll.", 64, 8, 357, 17)
$R_Dir = GUICtrlCreateRadio("Ordner", 32, 37, 49, 17)
GUICtrlSetOnEvent($R_Dir, "_Set_Dir_File")
GUICtrlSetState(-1, $GUI_CHECKED)
$R_File = GUICtrlCreateRadio("Datei", 32, 54, 49, 17)
GUICtrlSetOnEvent($R_File, "_Set_Dir_File")
$I_dir_file_path = GUICtrlCreateInput("", 96, 42, 220, 21)
GUICtrlSetState(-1, $GUI_ACCEPTFILES)
$B_search = GUICtrlCreateButton("Durchsuchen", 368, 36, 113, 33)
GUICtrlSetOnEvent($B_search, "_Search_Dir_File")
$B_add = GUICtrlCreateButton("+", 325, 36, 33, 33)
GUICtrlSetOnEvent($B_add, "_Add_Dir_File")
$I_ISO_Name = _CreateLabeledInput("ISO-Name", 96, 74, 260, 21)
GUICtrlSetData($I_ISO_Name, ".iso")
$B_search = GUICtrlCreateButton("Durchsuchen", 368, 84, 113, 33)
GUICtrlSetOnEvent($B_search, "_Save_ISO_File")
$B_Size_Refresh = GUICtrlCreateButton("", 475, 266, 33, 35, $BS_ICON)
GUICtrlSetImage(-1, "shell32.dll", -239)
GUICtrlSetOnEvent($B_Size_Refresh, "_Size_Refresh")
GUICtrlCreateGroup("", 32, 130, 441, 293)
$File_Dir_List = GUICtrlCreateListView("Pfad|Größe", 36, 145, 433, 270)
$File_Dir_List_handle = GUICtrlGetHandle($File_Dir_List)
GUICtrlSetState(-1, $GUI_ACCEPTFILES)
_GUICtrlListView_SetColumnWidth($File_Dir_List, 0, 335)
_GUICtrlListView_SetColumnWidth($File_Dir_List, 1, 75)
GUICtrlCreateGroup("", -99, -99, 1, 1)

$R_CD = GUICtrlCreateRadio("CD < 700 MB", 50, 425)
GUICtrlSetOnEvent($R_CD, "_Set_ISO_Groesse")
$R_DVD = GUICtrlCreateRadio("DVD < 4500MB", 150, 425)
GUICtrlSetState(-1, $GUI_CHECKED)
GUICtrlSetOnEvent($R_DVD, "_Set_ISO_Groesse")
$R_NO_DVD_CD = GUICtrlCreateRadio("> 4500MB", 250, 425)
GUICtrlSetOnEvent($R_NO_DVD_CD, "_Set_ISO_Groesse")

$B_EXIT = GUICtrlCreateButton("Beenden", 50, 555, 113, 35)
GUICtrlSetOnEvent($B_EXIT, "_Exit")
$B_Create_ISO = GUICtrlCreateButton("ISO erstellen", 350, 555, 113, 35)
GUICtrlSetOnEvent($B_Create_ISO, "_Create_ISO")
$B_ISO_Options = GUICtrlCreateButton("Weitere Optionen", 200, 555, 113, 35)
GUICtrlSetState($B_ISO_Options, $GUI_DISABLE)
GUICtrlSetOnEvent($B_ISO_Options, "_ISO_Options")

GUISetOnEvent($GUI_EVENT_DROPPED, "_File_Dir_Drop_Listview")

$Menu_1 = GUICtrlCreateMenu("Programm")
$Menu_1_1 = GUICtrlCreateMenuItem("Beenden",$Menu_1)
$Menu_2 = GUICtrlCreateMenu("Einstellungen")
$Menu_2_1 = GUICtrlCreateMenuItem('"Senden an" Eintrag erstellen/Löschen',$Menu_2)
$Menu_3 = GUICtrlCreateMenu("?")
$Menu_3_1 = GUICtrlCreateMenuItem('Info',$Menu_3)

GUICtrlSetOnEvent($Menu_1_1,"_Exit")
GUICtrlSetOnEvent($Menu_2_1,"_SendTo_Add_Delete")
GUICtrlSetOnEvent($Menu_3_1,"_About")

GUISetState(@SW_SHOW,$GUI_ISO)

$GUI_Foldersize = GUICreate("Ordner", 270, 66, Default, Default, $DS_MODALFRAME, $WS_EX_TOOLWINDOW, $GUI_ISO)
GUISetBkColor(0xFFFFFF)
$Label1 = GUICtrlCreateLabel("Ordnergröße wird ermittelt . . .", 8, 8, 253, 28)
GUICtrlSetFont(-1, 14)

_GDIPlus_Startup()

$hGraphics = _GDIPlus_GraphicsCreateFromHWND($GUI_ISO)
$hBitmap = _GDIPlus_BitmapCreateFromGraphics(511, 600, $hGraphics)
$hBackbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
_GDIPlus_GraphicsSetSmoothingMode($hBackbuffer, 2)

GUIRegisterMsg($WM_DROPFILES, "WM_DROPFILES_FUNC")
GUIRegisterMsg($WM_COPYDATA, '_MY_WM_COPYDATA')
GUIRegisterMsg($WM_TIMER, "_Redraw")
DllCall("User32.dll", "int", "SetTimer", "hwnd", $GUI_ISO, "int", 0, "int", 200, "int", 0)

_Size_Progress()
If $cmdline[0] > 0 Then
	For $x = 1 To $cmdline[0]
		If FileExists($cmdline[$x]) And _ArraySearch($AS_Dir_Files_2_Add, $cmdline[$x], 0, 0, 1) = -1 Then
			GUISetState(@SW_SHOW, $GUI_Foldersize)
			$D_Size = DirGetSize($cmdline[$x])
			If $D_Size = -1 Then
				$D_Size = FileGetSize($cmdline[$x])
			EndIf
			_ArrayAdd($AS_Dir_Files_2_Add_Size, $D_Size)
			_ArrayAdd($AS_Dir_Files_2_Add, $cmdline[$x])
			_GUICtrlListView_AddSubItem($File_Dir_List_handle, _GUICtrlListView_AddItem($File_Dir_List_handle, $cmdline[$x]), _GetDisplaySize($D_Size), 1)
			GUISetState(@SW_HIDE, $GUI_Foldersize)
			$MB = Round(_ArrayGetSumme($AS_Dir_Files_2_Add_Size) / 1024 / 1024)
			WinActivate($GUI_ISO)
		Else
			MsgBox(0, "ERROR", "Datei/Ordner (" & $cmdline[$x] & ") ist schon vorhanden oder existiert nicht!")
		EndIf
	Next
EndIf

While 1
	Sleep(20)
	If StringRight(GUICtrlRead($I_ISO_Name), 4) <> ".iso" Then
		GUICtrlSetData($I_ISO_Name, GUICtrlRead($I_ISO_Name) & ".iso")
	EndIf
	If _IsPressed("2E") And _GUICtrlListView_GetSelectedCount($File_Dir_List_handle) > 0 Then
		$selected = _GUICtrlListView_GetSelectedIndices($File_Dir_List_handle)
		$index = _ArraySearch($AS_Dir_Files_2_Add, _GUICtrlListView_GetItemText($File_Dir_List_handle, $selected))
		_ArrayDelete($AS_Dir_Files_2_Add, $index)
		_ArrayDelete($AS_Dir_Files_2_Add_Size, $index)
		_GUICtrlListView_DeleteItemsSelected($File_Dir_List_handle)
	EndIf
WEnd

Func _SendTo_Add_Delete()
	If FileExists($SendTo_Dir & "\ISO-Creator.lnk") Then
		FileDelete($SendTo_Dir & "\ISO-Creator.lnk")
	Else
		If @Compiled = 1 Then
			FileCreateShortcut(@ScriptFullPath,$SendTo_Dir & "\ISO-Creator.lnk")
		Else
			MsgBox(64,"Compiled","Skript ist nicht Compiliert, deshalb wird der Eintrag nicht erstellt")
		EndIf
	EndIf
EndFunc

Func _Size_Refresh()
	GUISetState(@SW_SHOW, $GUI_Foldersize)
	$P_GUI_Pos = WinGetPos($GUI_ISO)
	WinMove($GUI_Foldersize, "", $P_GUI_Pos[0] + 100, $P_GUI_Pos[1] + 250)
	Global $AS_Dir_Files_2_Add_Size[1] = [""]
	_GUICtrlListView_BeginUpdate($File_Dir_List_handle)
	_GUICtrlListView_DeleteAllItems($File_Dir_List_handle)
	For $i = 1 To UBound($AS_Dir_Files_2_Add) - 1
		$attrib = FileGetAttrib($AS_Dir_Files_2_Add[$i])
		If StringInStr($attrib, "D") Then
			_ArrayAdd($AS_Dir_Files_2_Add_Size, DirGetSize($AS_Dir_Files_2_Add[$i]))
		Else
			_ArrayAdd($AS_Dir_Files_2_Add_Size, FileGetSize($AS_Dir_Files_2_Add[$i]))
		EndIf
		_GUICtrlListView_AddSubItem($File_Dir_List_handle, _GUICtrlListView_AddItem($File_Dir_List_handle, $AS_Dir_Files_2_Add[$i]), _GetDisplaySize($AS_Dir_Files_2_Add_Size[$i]), 1)
	Next
	_GUICtrlListView_EndUpdate($File_Dir_List_handle)
	GUISetState(@SW_HIDE, $GUI_Foldersize)
EndFunc   ;==>_Size_Refresh

Func _Redraw($hWnd, $msg, $wParam, $lParam)
	_Size_Progress()
	Return $GUI_RUNDEFMSG
EndFunc   ;==>_Redraw

Func _File_Dir_Drop_Listview()
	If @GUI_DropId = $File_Dir_List Then
		Local $D_Size, $S_Dir_File_Add
		For $i = 0 To UBound($gaDropFiles) - 1
			$S_Dir_File_Add = $gaDropFiles[$i]

			If FileExists($S_Dir_File_Add) And _ArraySearch($AS_Dir_Files_2_Add, $S_Dir_File_Add, 0, 0, 1) = -1 Then
				GUICtrlSetData($I_dir_file_path, "")
				GUISetState(@SW_SHOW, $GUI_Foldersize)
				$P_GUI_Pos = WinGetPos($GUI_ISO)
				WinMove($GUI_Foldersize, "", $P_GUI_Pos[0] + 100, $P_GUI_Pos[1] + 250)
				$D_Size = DirGetSize($S_Dir_File_Add)
				If $D_Size = -1 Then
					$D_Size = FileGetSize($S_Dir_File_Add)
				EndIf
				_ArrayAdd($AS_Dir_Files_2_Add_Size, $D_Size)
				_ArrayAdd($AS_Dir_Files_2_Add, $S_Dir_File_Add)
				_GUICtrlListView_AddSubItem($File_Dir_List_handle, _GUICtrlListView_AddItem($File_Dir_List_handle, $S_Dir_File_Add), _GetDisplaySize($D_Size), 1)
				GUISetState(@SW_HIDE, $GUI_Foldersize)
				$MB = Round(_ArrayGetSumme($AS_Dir_Files_2_Add_Size) / 1024 / 1024)
			Else
				MsgBox(0, "ERROR", "Datei/Ordner schon vorhanden oder existiert nicht!")
			EndIf
		Next
	EndIf
EndFunc   ;==>_File_Dir_Drop_Listview

Func _Save_ISO_File()
	$S_File_tmp = FileSaveDialog("ISO Speichern", "", "ISO (*.iso)")
	If Not @error Then GUICtrlSetData($I_ISO_Name, $S_File_tmp)
EndFunc   ;==>_Save_ISO_File

Func _Create_ISO()
	If _GUICtrlListView_GetItemCount($File_Dir_List_handle) > 0 Then
		_ArrayAddQuotes($AS_Dir_Files_2_Add)
		$Parameters = _ArrayToString($AS_Dir_Files_2_Add, " ", 1)
		_ISO_Progress(Run('mkisofs.exe -o "' & GUICtrlRead($I_ISO_Name) & '" -J -r ' & $Parameters, @ScriptDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD), $GUI_ISO)
	Else
		MsgBox(0, "ERROR", "Es ist noch keine Datei für das ISO vorhanden!")
	EndIf
EndFunc   ;==>_Create_ISO

Func _ISO_Options()

EndFunc   ;==>_ISO_Options

Func _Size_Progress()
	$MB = Round(_ArrayGetSumme($AS_Dir_Files_2_Add_Size) / 1024 / 1024)
	$hBrush = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)
	_GDIPlus_GraphicsFillRect($hBackbuffer, 32, 450, 448, 100, $hBrush)
	$hBrush_Orange = _GDIPlus_BrushCreateSolid(0x77F57621)
	If ($ISO_Format_Groesse = "CD" And $MB > 700) Or ($ISO_Format_Groesse = "DVD" And $MB > 4700) Then
		$hBrush_MB = _GDIPlus_BrushCreateSolid(0xAAFF0000)
	Else
		$hBrush_MB = _GDIPlus_BrushCreateSolid(0xAA00FF00)
	EndIf

	If $MB < 700 Then
		_GDIPlus_GraphicsFillRect($hBackbuffer, 38, 483, 436 / 800 * $MB, 24, $hBrush_MB)
		_GDIPlus_GraphicsDrawRect($hBackbuffer, 37, 483, 436, 24)

		_GDIPlus_GraphicsFillRect($hBackbuffer, 436 / 800 * 700 + 34, 475, 7, 32, $hBrush_Orange)
		_GDIPlus_GraphicsDrawLine($hBackbuffer, 436 / 800 * 700 + 37, 475, 436 / 800 * 700 + 37, 507)
		_GDIPlus_GraphicsDrawString($hBackbuffer, "CD", 436 / 800 * 700 + 29, 455, "Arial", 7, 0x0002)

		For $x = 0 To 8
			_GDIPlus_GraphicsDrawLine($hBackbuffer, 436 / 800 * ($x * 100) + 37, 500, 436 / 800 * ($x * 100) + 37, 515)
			_GDIPlus_GraphicsDrawString($hBackbuffer, Int($x * 100), 436 / 800 * ($x * 100) + 29, 516, "Arial", 7, 0x0002)
		Next
	ElseIf $MB < 4700 Then
		_GDIPlus_GraphicsFillRect($hBackbuffer, 38, 483, 436 / 4800 * $MB, 24, $hBrush_MB)
		_GDIPlus_GraphicsDrawRect($hBackbuffer, 37, 483, 436, 24)

		_GDIPlus_GraphicsFillRect($hBackbuffer, 436 / 4800 * 700 + 34, 475, 7, 32, $hBrush_Orange)
		_GDIPlus_GraphicsDrawLine($hBackbuffer, 436 / 4800 * 700 + 37, 475, 436 / 4800 * 700 + 37, 507)
		_GDIPlus_GraphicsDrawString($hBackbuffer, "CD", 436 / 4800 * 700 + 29, 455, "Arial", 7, 0x0002)

		_GDIPlus_GraphicsFillRect($hBackbuffer, 436 / 4800 * 4700 + 34, 475, 7, 32, $hBrush_Orange)
		_GDIPlus_GraphicsDrawLine($hBackbuffer, 436 / 4800 * 4700 + 37, 475, 436 / 4800 * 4700 + 37, 507)
		_GDIPlus_GraphicsDrawString($hBackbuffer, "DVD", 436 / 4800 * 4700 + 29, 450, "Arial", 7, 0x0002)

		For $x = 0 To 9
			_GDIPlus_GraphicsDrawLine($hBackbuffer, 436 / 4800 * ($x * 500) + 37, 500, 436 / 4800 * ($x * 500) + 37, 515)
			_GDIPlus_GraphicsDrawString($hBackbuffer, Int($x * 500), 436 / 4800 * ($x * 500) + 29, 516, "Arial", 7, 0x0002)
		Next
	Else
		_GDIPlus_GraphicsFillRect($hBackbuffer, 38, 483, 436 / ($MB + 200) * $MB, 24, $hBrush_MB)
		_GDIPlus_GraphicsDrawRect($hBackbuffer, 37, 483, 436, 24)

		_GDIPlus_GraphicsFillRect($hBackbuffer, 436 / ($MB + 200) * 700 + 34, 475, 7, 32, $hBrush_Orange)
		_GDIPlus_GraphicsDrawLine($hBackbuffer, 436 / ($MB + 200) * 700 + 37, 475, 436 / ($MB + 200) * 700 + 37, 507)
		_GDIPlus_GraphicsDrawString($hBackbuffer, "CD", 436 / ($MB + 200) * 700 + 29, 455, "Arial", 7, 0x0002)

		_GDIPlus_GraphicsFillRect($hBackbuffer, 436 / ($MB + 200) * 4700 + 34, 475, 7, 32, $hBrush_Orange)
		_GDIPlus_GraphicsDrawLine($hBackbuffer, 436 / ($MB + 200) * 4700 + 37, 475, 436 / ($MB + 200) * 4700 + 37, 507)
		_GDIPlus_GraphicsDrawString($hBackbuffer, "DVD", 436 / ($MB + 200) * 4700 + 29, 450, "Arial", 7, 0x0002)
		For $x = 0 To 10
			_GDIPlus_GraphicsDrawLine($hBackbuffer, 436 / ($MB + 200) * ($x * (($MB + 200) / 10)) + 37, 500, 436 / ($MB + 200) * ($x * ($MB + 200) / 10) + 37, 515)
			_GDIPlus_GraphicsDrawString($hBackbuffer, Int($x * ($MB + 200) / 10), 436 / ($MB + 200) * ($x * ($MB + 200) / 10) + 29, 516, "Arial", 7, 0x0002)
		Next
	EndIf

	_GDIPlus_GraphicsDrawString($hBackbuffer, _GetDisplaySize(_ArrayGetSumme($AS_Dir_Files_2_Add_Size)), 210, 483, "Arial", 10)
	_GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, 0, 0, 511, 600)
EndFunc   ;==>_Size_Progress

Func _Set_Dir_File()
	If GUICtrlRead($R_Dir) = 1 Then
		$S_Dir_File = "Dir"
	ElseIf GUICtrlRead($R_File) = 1 Then
		$S_Dir_File = "File"
	EndIf
EndFunc   ;==>_Set_Dir_File

Func _Set_ISO_Groesse()
	If GUICtrlRead($R_CD) = 1 Then
		$ISO_Format_Groesse = "CD"
	ElseIf GUICtrlRead($R_DVD) = 1 Then
		$ISO_Format_Groesse = "DVD"
	ElseIf GUICtrlRead($R_NO_DVD_CD) = 1 Then
		$ISO_Format_Groesse = "other"
	EndIf
EndFunc   ;==>_Set_ISO_Groesse

Func _Search_Dir_File()
	If $S_Dir_File = "Dir" Then
		$S_Dir_tmp = FileSelectFolder("Achtung nur der Inhalt des ausgewählte Ordners wird ins ISO eingebunden, der Ordner wird im ISO nicht vorhanden sein.", "")
		If Not @error And FileExists($S_Dir_tmp) Then GUICtrlSetData($I_dir_file_path, $S_Dir_tmp)
	ElseIf $S_Dir_File = "File" Then
		$S_File_tmp = FileOpenDialog("Datei auswählen", "", "Alles (*.*)")
		If Not @error And FileExists($S_File_tmp) Then GUICtrlSetData($I_dir_file_path, $S_File_tmp)
	EndIf
EndFunc   ;==>_Search_Dir_File

Func _Add_Dir_File()
	Local $D_Size, $S_Dir_File_Add
	$S_Dir_File_Add = GUICtrlRead($I_dir_file_path)
	If FileExists($S_Dir_File_Add) And _ArraySearch($AS_Dir_Files_2_Add, $S_Dir_File_Add, 0, 0, 1) = -1 Then
		GUICtrlSetData($I_dir_file_path, "")
		GUISetState(@SW_SHOW, $GUI_Foldersize)
		$D_Size = DirGetSize($S_Dir_File_Add)
		If $D_Size = -1 Then
			$D_Size = FileGetSize($S_Dir_File_Add)
		EndIf
		_ArrayAdd($AS_Dir_Files_2_Add_Size, $D_Size)
		_ArrayAdd($AS_Dir_Files_2_Add, $S_Dir_File_Add)
		_GUICtrlListView_AddSubItem($File_Dir_List_handle, _GUICtrlListView_AddItem($File_Dir_List_handle, $S_Dir_File_Add), _GetDisplaySize($D_Size), 1)
		GUISetState(@SW_HIDE, $GUI_Foldersize)
		$MB = Round(_ArrayGetSumme($AS_Dir_Files_2_Add_Size) / 1024 / 1024)
		WinActivate($GUI_ISO)
	Else
		MsgBox(0, "ERROR", "Datei/Ordner schon vorhanden oder existiert nicht!")
	EndIf
EndFunc   ;==>_Add_Dir_File

Func _GetDisplaySize($iSize, $iPlaces = 2)
	Local $aBytes[5] = [' Bytes', ' KB', ' MB', ' GB', ' TB']
	For $i = 4 To 1 Step -1
		If $iSize >= 1024 ^ $i Then
			Return Round($iSize / 1024 ^ $i, $iPlaces) & $aBytes[$i]
		EndIf
	Next
	Return $iSize & ' Bytes'
EndFunc   ;==>_GetDisplaySize

Func _ArrayGetSumme($array)
	Local $wert = 0
	For $x = 0 To UBound($array) - 1
		$wert += $array[$x]
	Next
	Return $wert
EndFunc   ;==>_ArrayGetSumme

Func _About()
	MsgBox(262144,"Über","ISO-Creator V" & $version & @CRLF & @CRLF & "Mady By Keyle" & @CRLF & @CRLF & "Thanks@all für die Hilfe",15)
EndFunc

Func _Exit()
	_GDIPlus_GraphicsDispose($hGraphics)
	_GDIPlus_GraphicsDispose($hBackbuffer)
	_GDIPlus_Shutdown()
	Exit
EndFunc   ;==>_Exit

Func _ArrayAddQuotes(ByRef $array)
	For $x = 0 To UBound($array) - 1
		If $array[$x] <> "" And StringLeft($array[$x], 1) <> '"' Then
			$array[$x] = '"' & $array[$x] & '"'
		EndIf
	Next
EndFunc   ;==>_ArrayAddQuotes

Func _CreateLabeledInput($Text, $x, $y, $width, $height)
	GUICtrlCreateLabel($Text, $x, $y, $width)
	Return GUICtrlCreateInput("", $x, $y + 18, $width, $height)
EndFunc   ;==>_CreateLabeledInput

Func _ISO_Progress($PID, $P_GUI)
	Opt("GUIOnEventMode", 0)
	$P_GUI_Pos = WinGetPos($P_GUI)
	$GUI_ISO_Progress = GUICreate("0% . . .", 325, 125, $P_GUI_Pos[0] + 100, $P_GUI_Pos[1] + 250, $WS_DLGFRAME, Default, $P_GUI)
	$ISO_Progress = GUICtrlCreateProgress(24, 8, 281, 33)
	$B_Abbrechen = GUICtrlCreateButton("Abbrechen", 112, 56, 91, 33)
	GUISetState(@SW_SHOW, $GUI_ISO_Progress)
	GUISetState(@SW_DISABLE, $P_GUI)

	While 1
		$nMsg = GUIGetMsg()
		Switch $nMsg
			Case $GUI_EVENT_CLOSE
				ExitLoop
				ProcessClose($PID)
			Case $B_Abbrechen
				ExitLoop
				ProcessClose($PID)
		EndSwitch
		$line = StderrRead($PID)
		If ProcessExists($PID) = 0 Then ExitLoop
		If $line <> "" Then
			$patern = StringRegExp($line, "\d?\d\.\d\d%", 2)
			If IsArray($patern) Then
				GUICtrlSetData($ISO_Progress, $patern[UBound($patern) - 1])
				WinSetTitle($GUI_ISO_Progress, "", $patern[UBound($patern) - 1] & " . . .")
			EndIf
		EndIf

	WEnd
	GUIDelete($GUI_ISO_Progress)
	GUISetState(@SW_ENABLE, $P_GUI)
	WinActivate($P_GUI)
	Opt("GUIOnEventMode", 1)
EndFunc   ;==>_ISO_Progress

Func WM_DROPFILES_FUNC($hWnd, $msgID, $wParam, $lParam)
	Local $nSize, $pFileName
	Local $nAmt = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", 0xFFFFFFFF, "ptr", 0, "int", 255)
	For $i = 0 To $nAmt[0] - 1
		$nSize = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", 0, "int", 0)
		$nSize = $nSize[0] + 1
		$pFileName = DllStructCreate("char[" & $nSize & "]")
		DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", DllStructGetPtr($pFileName), "int", $nSize)
		ReDim $gaDropFiles[$i + 1]
		$gaDropFiles[$i] = DllStructGetData($pFileName, 1)
		$pFileName = 0
	Next
EndFunc   ;==>WM_DROPFILES_FUNC

Func _MY_WM_COPYDATA($hWnd, $msg, $wParam, $lParam) ;original by Prog@ndy - Edit by Keyle
	Local $Temp = ""
	Local $COPYDATA = DllStructCreate('Ptr;DWord;Ptr', $lParam)
	Local $COPYDATA_StringLen = DllStructGetData($COPYDATA, 2)
	Local $CmdStruct = DllStructCreate('Char[' & $COPYDATA_StringLen & ']', DllStructGetData($COPYDATA, 3))
	$COPYDATA_String = StringLeft(DllStructGetData($CmdStruct, 1), $COPYDATA_StringLen)
	$Extern_cmdline = StringSplit($COPYDATA_String,"|")
	_ArrayDelete($Extern_cmdline,0)
	If $Extern_cmdline[0] > 0 Then
	For $x = 1 To $Extern_cmdline[0]
		If FileExists($Extern_cmdline[$x]) And _ArraySearch($AS_Dir_Files_2_Add, $Extern_cmdline[$x], 0, 0, 1) = -1 Then
			GUISetState(@SW_SHOW, $GUI_Foldersize)
			$D_Size = DirGetSize($Extern_cmdline[$x])
			If $D_Size = -1 Then
				$D_Size = FileGetSize($Extern_cmdline[$x])
			EndIf
			_ArrayAdd($AS_Dir_Files_2_Add_Size, $D_Size)
			_ArrayAdd($AS_Dir_Files_2_Add, $Extern_cmdline[$x])
			_GUICtrlListView_AddSubItem($File_Dir_List_handle, _GUICtrlListView_AddItem($File_Dir_List_handle, $Extern_cmdline[$x]), _GetDisplaySize($D_Size), 1)
			GUISetState(@SW_HIDE, $GUI_Foldersize)
			$MB = Round(_ArrayGetSumme($AS_Dir_Files_2_Add_Size) / 1024 / 1024)
			WinActivate($GUI_ISO)
		Else
			MsgBox(0, "ERROR", "Datei/Ordner (" & $Extern_cmdline[$x] & ") ist schon vorhanden oder existiert nicht!")
		EndIf
	Next
EndIf
EndFunc   ;==>_MY_WM_COPYDATA

Func _SendCopyDataString($My_Hwnd, $Scite_hwnd, $sCmd) ; by Prog@ndy
	Local $CmdStruct = DllStructCreate('Char[' & StringLen($sCmd) + 1 & ']')
	DllStructSetData($CmdStruct, 1, $sCmd)
	Local $COPYDATA = DllStructCreate('Ptr;DWord;Ptr')
	DllStructSetData($COPYDATA, 1, 1)
	DllStructSetData($COPYDATA, 2, StringLen($sCmd) + 1)
	DllStructSetData($COPYDATA, 3, DllStructGetPtr($CmdStruct))
	DllCall('User32.dll', 'None', 'SendMessage', 'HWnd', $Scite_hwnd, 'Int', $WM_COPYDATA, 'HWnd', $My_Hwnd, 'Ptr', DllStructGetPtr($COPYDATA))
EndFunc   ;==>_SendCopyDataString