#NoTrayIcon
#RequireAdmin
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=Process.ico
#AutoIt3Wrapper_Outfile=Prozess-Killer_V2.0.exe
#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_Res_Comment=Kleiner Prozess-Killer
#AutoIt3Wrapper_Res_Description=Beendet ausgewählte nicht geschüzte Prozesse
#AutoIt3Wrapper_Res_Fileversion=2.0.0.0
#AutoIt3Wrapper_Res_LegalCopyright=TV_Freeze 2017
#AutoIt3Wrapper_Res_Language=1031
#AutoIt3Wrapper_Res_requestedExecutionLevel=asInvoker
#AutoIt3Wrapper_Res_Field=CompanyName|None
#AutoIt3Wrapper_Res_Field=ProductName|Prozess-Killer V2.0
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
;
; Prozess-Killer V2.0
; Coded by TV_Freeze
; Version vom 30.10.2017
; with Autoit Version 3.3.14.2
;
; Function:
; Prozesse sofort beenden
; Prozesse nach Zeitablauf beenden
; Prozesse in einer Blockliste immer wieder beenden ! (Achtung!)
;
; changelog-> : auf Windows 10 angepasst...
;             : erkennung vom OS optimiert...
;             : ToolTips zu den Prozessen hinzugefügt
;             : TrayMenu - Computer herunter oder neu starten hinzugefügt
;             : Routine momentane Prozess-Liste abspeichern - verbessert
;             : Anzeige von CPU-Name und Hauptspeicher
; ----------------------------------------------------------------------------------------------------------------------------------------------
#include <Array.au3>
#include <TrayConstants.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <GuiStatusBar.au3>
#include <ListViewConstants.au3>
#include <Misc.au3>
#include <StaticConstants.au3>
#include <StructureConstants.au3>
#include <UpDownConstants.au3>
#include <WindowsConstants.au3>
;
;Opt("MustDeclareVars", 1) ; 0=nein, 1=erfordert Deklaration
Opt("GUIOnEventMode", 1) ; 0=ausgeschaltet, 1=OnEvent Modus aktiviert
Opt("TrayMenuMode", 1 + 2) ; kein Tray-Standardmenü
Opt("TrayOnEventMode", 1) ; 0=ausschalten, 1=einschalten
Opt("GUICloseOnESC", 0) ; 0=bei ESC nicht schliesen, 1=bei ESC schliesen
Opt('GUIResizeMode', $GUI_DOCKBORDERS) ; den Standard-Resize-Modus auf DOCKBORDERS (an den Raendern andocken) setzen
;Opt('GUIResizeMode', $GUI_DOCKHCENTER + $GUI_DOCKTOP + $GUI_DOCKHEIGHT)
;
; ----------Variablen-für-Prozess-Killer----------------------------------------------------------------------
Global Const $sTitle = 'Prozess-Killer' ; Name des Programms
; ---Prüfe-welches-Betriebsystem------------------------------------------------------------------------------
If Not StringInStr('Win_XP WIN_XPe Win_Vista Win_7 WIN_8 WIN_81 Win_10', @OSVersion) Then
	Global $Msg = 'Dieses Programm funktioniert nur unter:' & @CRLF & @CRLF
	$Msg &= 'Windows XP, Windows Vista, Windows 7' & @CRLF & 'Windows 8, Windows 8.1 und Windows 10'
	Exit MsgBox(48, $sTitle & '!', $Msg) ; falsches Betriebssystem ? - > Benachrichten und Programm benden
EndIf
; ---Prüfe-ob-eine Instanz des Programms läuft----------------------------------------------------------------
If _Singleton($sTitle, 1) = 0 Then ; Wenn das Programm bereits läuft, dann...
	WinActivate($sTitle, '') ; Programm aktivieren (in den Vordergrund holen)
	MsgBox(48, $sTitle & '!', 'Eine Instanz des Programms läuft bereichts!', 8) ; Benutzer darauf 8 Sekunden hinweisen
	Exit ; und den zweiten Programmaufruf beenden
EndIf
; ---hole-die-Infos-des-Betriebssystems-------------------------------------------------------------------------------
Global Const $WindowVersion = _CI_GetWindowsInfo()
Global Const $Prozessor = _CI_GetCPU()
Global Const $Hspeicher = $WindowVersion[1][3]
Global $systeminfo, $system, $cpu, $speicher
; Stringanpassung
$systeminfo = $WindowVersion[1][0]
$systeminfo = StringMid($systeminfo, 11, StringLen($systeminfo))
$systeminfo = StringTrimRight($systeminfo, 4)
If StringMid($systeminfo, 10, 5) = 'Vista' Then
	$systeminfo = StringMid($systeminfo, 10, StringLen($systeminfo))
EndIf
If StringLeft($systeminfo, 1) = ' ' Then $systeminfo = StringTrimLeft($systeminfo, 1)
If StringMid($systeminfo, 1, 24) = 'Microsoft® Windows Vista' Then $systeminfo = StringMid($systeminfo, 12, StringLen($systeminfo))
; ---prüfe-den-CPU-Typ----------------------------------------------------------------------------------------
If @OSArch = 'X64' Or @OSArch = 'IA64' Then $systeminfo = $systeminfo & '64Bit)'
If @OSArch = 'X86' Then $systeminfo = $systeminfo & '32Bit)'
;
; ---diese-Prozesse-ausfiltern-wenn gewünscht-----------------------------------------------------------------
; fade out processes ; add more yourself
Global $forbidden_process[78] = ['System Idle Process', 'System', 'smss.exe', 'csrss.exe', 'wininit.exe', 'services.exe', 'lsass.exe', 'lsm.exe', _
		'ctfmon.exe', 'winlogon.exe', 'svchost.exe', 'spoolsv.exe', 'taskhost.exe', 'explorer.exe', 'dwm.exe', 'mmc.exe', 'LogonUI.exe', 'userinit.exe', _
		'msiexec.exe', 'DeviceDisplayObjectProvider.exe', 'sppsvc.exe', 'WmiPrvSe.exe', 'VSSVC.exe', 'dllhost.exe', 'rundll32.exe', 'wdfmgr.exe', _
		'mscorsvw.exe', 'alg.exe', 'taskeng.exe', 'TrustedInstaller.exe', 'WmiApSrv.exe', _
		'nvvsvc.exe', 'nvxdsync.exe', 'nvSCPAPISvr.exe', 'audiodg.exe', 'WUDFHost.exe', 'WMIADAP.exe', 'dinotify.exe', 'wlms.exe', _
		'SppExtComObj.Exe', 'SearchFilterHost.exe', 'SearchIndexer.exe', 'SearchProtocolHost.exe', 'Taskmgr.exe', 'MpCmdRun.exe', 'MsMpEng.exe', _
		'NisSrv.exe', 'taskhostex.exe', 'WSHost.exe', 'WerFault.exe', 'unsecapp.exe', 'SLsvc.exe', _
		'Conhost.exe', 'InstallAgent.exe', 'RunTimeBroker.exe', 'searchui.exe', 'SettingSyncHost.exe', _ ; Processes from Win10
		'ShellExperienceHost.exe', 'sihost.exe', 'SystemSettingsBroker.exe', 'Taskhostw.exe', _ ; Processes from Win10
		'fontdrvhost.exe', 'ApplicationFrameHost.exe', 'DataExchangeHost.exe', 'SecurityHealthService.exe', 'SystemSettings.exe', _ ;Processes from Win10
		'WinStore.App.exe', 'Memory Compression', 'backgroundTaskHost.exe', 'dasHost.exe', 'smartscreen.exe', _ ;Processes from Win10
		'cleanmgr.exe', 'DismHost.exe', 'TiWorker.exe', 'SCMSOK.exe', 'vds.exe'] ; Processes from Win10
; Extra Prozessnamen die nicht richtig Angezeigt oder Ermittelt werden können
Global $extra_names[14] = ['audiodg.exe', 'dllhost.exe', 'csrss.exe', 'lsass.exe', 'smss.exe', 'services.exe', _
		'mofcomp.exe', 'NisSrv.exe', 'MsMpEng.exe', 'SecurityHealthService.exe', 'sppsvc.exe', 'svchost.exe', 'wininit.exe', 'iexplore.exe']
Global $eDescription[14] = ['Windows Graphisolierung für Audiogeräte', 'COM Surrogate', 'Client-Server-Laufzeitprozess', _
		'The Managed Object Format (MOF) Compiler', 'Local Security Authority Process', 'Windows-Sitzungs-Manager', 'Anwendung für Dienste und Controller', 'Microsoft Network Realtime Inspection Service', _
		'Antimalware Service Executable', 'Windows Security Health Service', 'Softwareschutzplattform-Dienst von Microsoft', 'Hostprozess für Windows-Dienste', 'Windows-Startanwendung', 'Internet Explorer']
;
; ---noch-mehr-Variablen---------------------------------------------------------------------------------------------------------------------------------
Global $pfad = @ScriptDir ; savepfad
Global Const $sDate = '30.10.2017' ; Datum der Erstellung
Global Const $sVersion = ' v2.0' ; Versionsnummer
Global Const $sAuthor = 'TV_Freeze' ; Programmierer dieses Programms
Global Const $iColCount = 3 ; die Anzahl der Spalten im Listview
Global Const $aHeader[$iColCount] = ['Prozess', 'PID', 'Pfad'] ; Die Überschriften für das Listview
Global $sHeader = _ArrayToString($aHeader) ; aus dem Ueberschriften-Array einen String generieren
Global Const $sAppDir = StringFormat('%s\%s\', @AppDataDir, $sTitle) ; Pfad zum Anwendungsordner generieren
If Not FileExists($sAppDir) Then ; wenn der Anwendungsordner noch nicht existiert, dann...
	If Not DirCreate($sAppDir) Then ; wenn der Ordner nicht erstellt werden konnte, dann...
		Exit MsgBox($MB_OK, $sTitle & $sVersion, 'Es konnte kein Verzeichnis im Anwendungsordner erstellt werden!' & @CRLF & 'Das Programm wird jetzt beendet...') ; das Programm mit einer Fehlermeldung beenden
	EndIf
EndIf
Global Const $sInifile = $sAppDir & $sTitle & '.ini' ; eine Variable mit Pfad und Name der Inidatei
Global Const $blocklist = $sAppDir & $sTitle & '_blocklist.ini' ; eine Variable mit Pfad und Name der Blockliste-Datei
Global Const $extrapfad = @WindowsDir & '\System32\' ; extra Pfad für den Taskscan
Global $iWidthMin = 800 ; die Breite des Hauptfenster
Global $iHeightMin = 600 ; die Hoehe des Hauptfenster
Global Const $sc_pfad = @ScriptDir ; Pfad dieses Scripts
Global $filemenu, $optinons, $extras, $newblocklist, $showblocklist, $saveitem, $additem, $parameter, $exit, $auto, $unlocker, $link, $groesse
Global $clock, $label, $processes, $tray_kill, $tray_id, $traymenu, $memoryinfo, $memory_show, $old_std, $old_min, $servicekill, $service_exit
Global $sort_all, $show_all, $extraInfo, $scan_again, $scan_every[7], $autotray, $tree_all, $starttray, $notray, $tray, $noInfo, $rem, $hInfoGui
Global $winInfo, $Description, $tipp, $instructions, $unlock, $olddata[1], $group[3], $neu = 0, $bcheck, $iHotItem
Global $aProcessList, $Processnames[0], $ProcessPIDs[0], $Processpaths[0], $ProcessCommand[0], $ProcessOwner[0], $ProcessDescription[0]
Global $status, $box1, $radio1, $radio2, $input, $info, $oldinput, $newinput, $updown, $start, $tasklist, $cl, $close, $show, $aServicesInfo
Global $Process_List, $daten[1], $sel[1], $listlenght ; Listviewitems
Global $ende, $tray_on, $Msg, $exititem, $showprog, $break, $computer, $t, $nr, $zaehler, $about, $go, $website, $number, $oldnumber = 0, $tmp
Global $backWert, $mem, $aGesamt, $aMemTot, $count = 0, $count2 = 0, $time
; ---Einstellungen-einlesen---------------------------------------------------------------------------------------------------------------------------------
Global $iWidth = IniRead($sInifile, 'Settings', 'Width', $iWidthMin) ; die Breite des Hauptfensters aus der Inidatei lesen (Standard: 800 pixel)
Global $iHeight = IniRead($sInifile, 'Settings', 'Height', $iHeightMin) ; die Hoehe des Hauptfensters aus der Inidatei lesen (Standard: 500 pixel)
Global $iLeft = IniRead($sInifile, 'Settings', 'Left', 0) ; die Position (links) des Hauptfensters aus der Inidatei lesen (Standard: Links/Oben)
Global $iTop = IniRead($sInifile, 'Settings', 'Top', 0) ; die Position (oben) des Hauptfensters aus der Inidatei lesen (Standard: Links/Oben)
Global $fMaximize = IniRead($sInifile, 'Settings', 'Maximize', False) == True ; ob das Hauptfensters maximiert wurde aus der Inidatei lesen (Standard: nein)
Global $Autostart = IniRead($sInifile, 'Settings', 'autostart', '0')
Global $again = IniRead($sInifile, 'Settings', 'again', '0')
Global $all = IniRead($sInifile, 'Settings', 'allprocesses', '1')
Global $block = IniRead($sInifile, 'Settings', 'block', '0')
Global $fast = IniRead($sInifile, 'Settings', 'fast', '1')
Global $memory_sh = IniRead($sInifile, 'Settings', 'memory', '0')
Global $ttip = IniRead($sInifile, 'Settings', 'ttip', '0')
Global $info2 = IniRead($sInifile, 'Settings', 'infos', '1')
Global $close = IniRead($sInifile, 'Settings', 'close', '0')
Global $backupZ = IniRead($sInifile, 'Settings', 'countdown', '60')
Global $sort = IniRead($sInifile, 'Settings', 'sort', '1')
Global $autotray = IniRead($sInifile, 'Settings', 'tray', '0')
Global $tree = IniRead($sInifile, 'Settings', 'tree', '1')
Global $unlocker = IniRead($sInifile, 'Settings', 'unlock', '0')
Global $aColWidth[$iColCount] ; Reserviert für die Spalten
$aColWidth[0] = IniRead($sInifile, 'Settings', '0', '128') ; Spalte 0 des Listviews
$aColWidth[1] = IniRead($sInifile, 'Settings', '1', '40') ; Spalte 1

; Icon & Logo auf Platte schreiben, wenn nocht nicht vorhanden
If Not FileExists($sAppDir & 'Prozess.ico') Then _ProcessIco(True, $sAppDir) ; schreibe Icon auf die Platte, wenn keins vorhanden ist...
If Not FileExists($sAppDir & 'Clock.ico') Then _ClockIcon(True, $sAppDir) ; schreibe Icon auf die Platte, wenn keins vorhanden ist...
If Not FileExists($sAppDir & 'MyLogo.bmp') Then _MyLogo(True, $sAppDir) ; schreibe mein Logobild auf die Platte, wenn keins vorhanden ist...
Global Const $Icon = @AppDataDir & '\' & $sTitle & '\Prozess.ico' ; Pfad meines Icons
Global Const $Icon2 = @AppDataDir & '\' & $sTitle & '\Clock.ico' ; Pfad für die Uhr Icons
; Mein Logo
Global $BMP = $sAppDir & 'MyLogo.bmp'

; Hauptfenster erstellen
Global $hGUI = GUICreate($sTitle & $sVersion, $iWidth, $iHeight, $iLeft, $iTop, BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX), $WS_EX_WINDOWEDGE)
GUISetFont(8.5, 400, 0, 'Verdana', $hGUI, 5)
GUISetIcon($Icon, 0)
TraySetIcon($Icon, 0)

; Wenn Haupfenster-Funktionen geklickt werden...
GUISetOnEvent($GUI_EVENT_CLOSE, '_End')
GUISetOnEvent($GUI_EVENT_MINIMIZE, '_Min_Main_Window')
GUISetOnEvent($GUI_EVENT_RESTORE, '_Min_Main_Window')

; Menü vom Hauptfenster erstellen
$filemenu = GUICtrlCreateMenu("&Datei")
$optinons = GUICtrlCreateMenu("&Einstellungen")
$extras = GUICtrlCreateMenu("E&xtras")

$showblocklist = GUICtrlCreateMenuItem("&Editiere Blockliste", $filemenu)
GUICtrlSetOnEvent(-1, '_Edit_Blocklist')
$newblocklist = GUICtrlCreateMenuItem("&Neue Blockliste erstellen", $filemenu)
GUICtrlSetOnEvent(-1, '_NewBlockList')
GUICtrlCreateMenuItem('', $filemenu) ; einen Leer-Eintrag (Querstrich) im Dateimenue
$additem = GUICtrlCreateMenuItem("&Neuen Prozess hinzufügen", $filemenu)
GUICtrlSetOnEvent(-1, '_add_task')
GUICtrlCreateMenuItem('', $filemenu) ; einen Leer-Eintrag (Querstrich) im Dateimenue
$saveitem = GUICtrlCreateMenuItem("&Momentane Prozessliste abspeichern", $filemenu)
GUICtrlSetOnEvent(-1, '_Save_Processlist')
GUICtrlCreateMenuItem('', $filemenu) ; einen Leer-Eintrag (Querstrich) im Dateimenue
$exit = GUICtrlCreateMenuItem("E&xit", $filemenu)
GUICtrlSetOnEvent(-1, '_End2')

$scan_again = GUICtrlCreateMenu("Auto-Aktualisieren", $optinons)
$scan_every[0] = GUICtrlCreateMenuItem("Deaktiviert (nur einmal)", $scan_again)
GUICtrlSetOnEvent(-1, '_Auto_Refresh')
$scan_every[1] = GUICtrlCreateMenuItem("jede 1 Sekunde", $scan_again)
GUICtrlSetOnEvent(-1, '_Auto_Refresh')
$scan_every[2] = GUICtrlCreateMenuItem("jede 2 Sekunden", $scan_again)
GUICtrlSetOnEvent(-1, '_Auto_Refresh')
$scan_every[3] = GUICtrlCreateMenuItem("jede 4 Sekunden", $scan_again)
GUICtrlSetOnEvent(-1, '_Auto_Refresh')
$scan_every[4] = GUICtrlCreateMenuItem("jede 6 Sekunden", $scan_again)
GUICtrlSetOnEvent(-1, '_Auto_Refresh')
$scan_every[5] = GUICtrlCreateMenuItem("jede 8 Sekunden", $scan_again)
GUICtrlSetOnEvent(-1, '_Auto_Refresh')
$scan_every[6] = GUICtrlCreateMenuItem("jede 10 Sekunden", $scan_again)
GUICtrlSetOnEvent(-1, '_Auto_Refresh')

$noInfo = GUICtrlCreateMenuItem("&Benachrichtigungen im Tray anzeigen", $optinons)
GUICtrlSetOnEvent(-1, '_Trayinfos_OnOff')
$tree_all = GUICtrlCreateMenuItem("&Gleiche Prozesse auch schließen", $optinons)
GUICtrlSetOnEvent(-1, '_Kill_Tree_OnOff')
$sort_all = GUICtrlCreateMenuItem("S&ortiere alle Prozesse (aphabetisch)", $optinons)
GUICtrlSetOnEvent(-1, '_Sort_AllProcess_OnOff')
$show_all = GUICtrlCreateMenuItem("S&ystem Prozesse einblenden (alles anzeigen)", $optinons)
GUICtrlSetOnEvent(-1, '_Show_AllProcess_OnOff')
$auto = GUICtrlCreateMenuItem("Starte " & $sTitle & " mit &Windows", $optinons)
GUICtrlSetOnEvent(-1, '_Autostart_with_Windows')
$extraInfo = GUICtrlCreateMenuItem("&Prozess ToolTips anzeigen", $optinons)
GUICtrlSetOnEvent(-1, '_MyToolTip_OnOff')
$starttray = GUICtrlCreateMenuItem("Vers&tecken beim Start", $optinons)
GUICtrlSetOnEvent(-1, '_Auto_Hide_to_Tray')
$tray = GUICtrlCreateMenuItem("&Verstecken beim Schließen", $optinons)
GUICtrlSetOnEvent(-1, '_Hide_when_close')
$memory_show = GUICtrlCreateMenuItem("&Zeige Speicherverbrauch/Uhrzeit", $optinons)
GUICtrlSetOnEvent(-1, '_Memory_OnOff')

$about = GUICtrlCreateMenuItem("Prozess-Killer  &Info", $extras)
GUICtrlSetOnEvent(-1, '_mein_about')
$instructions = GUICtrlCreateMenuItem("&Kurze Beschreibung", $extras)
GUICtrlSetOnEvent(-1, '_kurze_Beschreibung')
$groesse = GUICtrlCreateMenuItem("&Fensterauflösung ändern", $extras)
GUICtrlSetOnEvent(-1, '_Aufloesungen')
$unlock = GUICtrlCreateMenuItem("Erweitere Beenden über Zeit", $extras)
GUICtrlSetOnEvent(-1, '_Unlock')
$link = GUICtrlCreateMenuItem("&Verknüfung anlegen (Desktop)", $extras)
GUICtrlSetOnEvent(-1, '_Verknuefnung')
$website = GUICtrlCreateMenuItem("&www.AutoIt.de Webseite aufrufen", $extras)
GUICtrlSetOnEvent(-1, '_gowebsite')

; Rahmen erstellen
$group[2] = GUICtrlCreateGroup('', 4, 0, $iWidth - 15, $iHeight - 104)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKLEFT + $GUI_DOCKRIGHT) ; Resizising Group (Rahmen) neu erstellen
$group[0] = GUICtrlCreateGroup('', 4, 0, $iWidth - 15, 38)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKLEFT + $GUI_DOCKRIGHT) ; Resizising Group (Rahmen) neu erstellen

; Betriebssystem anzeigen
$system = GUICtrlCreateLabel($systeminfo, 12, 13)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKLEFT + $GUI_DOCKTOP) ; und das Resizising festlegen
GUICtrlSetColor(-1, 0xA00000)

; Prozessorname anzeigen
If $iWidth = 800 Then
	$cpu = GUICtrlCreateLabel($Prozessor, $iWidth - 475, 13)
ElseIf $iWidth = 1024 Then
	$cpu = GUICtrlCreateLabel($Prozessor, $iWidth - 590, 13)
ElseIf $iWidth = 1152 Then
	$cpu = GUICtrlCreateLabel($Prozessor, $iWidth - 660, 13)
ElseIf $iWidth = 1280 Then
	$cpu = GUICtrlCreateLabel($Prozessor, $iWidth - 730, 13)
EndIf
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKLEFT + $GUI_DOCKTOP) ; und das Resizising festlegen
GUICtrlSetColor(-1, 0xA00000)

; Hauptspeicher anzeigen
If $iWidth = 800 Then
	$speicher = GUICtrlCreateLabel($Hspeicher & ' RAM', $iWidth - 130, 13)
ElseIf $iWidth = 1024 Or $iWidth = 1152 Or $iWidth = 1280 Then
	$speicher = GUICtrlCreateLabel($Hspeicher & ' RAM', $iWidth - 140, 13)
EndIf
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKLEFT + $GUI_DOCKRIGHT + $GUI_DOCKTOP) ; und das Resizising festlegen
GUICtrlSetColor(-1, 0xA00000)

; Schalter und Knöfe erstellen
$box1 = GUICtrlCreateCheckbox("Beende Prozesse in Blockliste", 12, 42, 190, 20)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKLEFT + $GUI_DOCKTOP) ; und das Resizising festlegen
GUICtrlSetTip(-1, 'Beende alle Prozesse in der Blockliste und' & @CR & 'auch sie noch mal gestartet werden')
GUICtrlSetOnEvent(-1, '_Checkbox')

$radio1 = GUICtrlCreateRadio("Beende jetzt", 213, 42, 88, 20)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKLEFT + $GUI_DOCKTOP) ; und das Resizising festlegen
GUICtrlSetTip(-1, 'Beendet Prozesse sofort')

$radio2 = GUICtrlCreateRadio("Beende nach Zeit", 318, 42, 118, 20)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKLEFT + $GUI_DOCKTOP) ; und das Resizising festlegen
GUICtrlSetTip(-1, 'Zählt die Sekunden herunter und beendet selektierte Prozesse')
GUICtrlSetOnEvent(-1, '_Checkradio2')

; Zeit Eingabe prüfen
If $unlocker = 0 Then
	$input = GUICtrlCreateInput("60", 440, 42, 60, 20, BitOR($ES_NUMBER, $ES_CENTER))
	GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKLEFT + $GUI_DOCKTOP) ; und das Resizising festlegen
	GUICtrlSetOnEvent(-1, '_Input')
	If $backupZ <> GUICtrlRead($input) Then
		If $backupZ > 0 And $backupZ < 3601 Then GUICtrlSetData($input, $backupZ)
	EndIf
	$oldinput = GUICtrlRead($input)
	GUICtrlSetTip(-1, 'Eingabe der Sekunden zum beenden' & @CRLF & 'der Prozesse... [1-3600]')
	GUICtrlSetLimit($input, 4, 1)
	$updown = GUICtrlCreateUpdown($input, $UDS_NOTHOUSANDS)
	GUICtrlSetLimit($updown, 3600, 1)
	$label = GUICtrlCreateLabel("Sekunden...", 510, 46)
	GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKLEFT + $GUI_DOCKTOP) ; und das Resizising festlegen
Else
	$input = GUICtrlCreateInput("60", 440, 42, 84, 20, BitOR($ES_NUMBER, $ES_CENTER))
	GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKLEFT + $GUI_DOCKTOP) ; und das Resizising festlegen
	GUICtrlSetOnEvent(-1, '_Input')
	If $backupZ <> GUICtrlRead($input) Then
		If $backupZ > 0 And $backupZ < 31536001 Then GUICtrlSetData($input, $backupZ)
	EndIf
	$oldinput = GUICtrlRead($input)
	GUICtrlSetTip(-1, 'Eingabe der Sekunden zum beenden... [1-31536000]', '', -1, 2)
	GUICtrlSetLimit($input, 8, 1)
	$updown = GUICtrlCreateUpdown($input, $UDS_NOTHOUSANDS)
	GUICtrlSetLimit($updown, 31536000, 1)
	$label = GUICtrlCreateLabel("Sekunden...", 536, 46)
	GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKLEFT + $GUI_DOCKTOP) ; und das Resizising festlegen
EndIf
$group[1] = GUICtrlCreateGroup('', -99, -99, 1, 1) ; Gruppe schliessen
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKLEFT + $GUI_DOCKRIGHT) ; Resizising Group (Rahmen) neu erstellen

; Startknopf
$start = GUICtrlCreateButton("Prozesse abschießen", 10, $iHeight - 98, 128, 22)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKLEFT + $GUI_DOCKTOP) ; und das Resizising festlegen
GUICtrlSetOnEvent(-1, '_Start')

; Listview fuer die Anzeige der Prozessliste
Global $idListView = GUICtrlCreateListView($sHeader, 12, 70, $iWidth - 25, $iHeight - 180, $LVS_SHOWSELALWAYS, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_CHECKBOXES, $LVS_EX_INFOTIP, $LVS_EX_DOUBLEBUFFER)) ; Listview erstellen
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKLEFT + $GUI_DOCKRIGHT + $GUI_DOCKTOP) ; Resizising
Global $hListView = GUICtrlGetHandle($idListView) ; das Handle vom Listview
Global $hLVHeader = _GUICtrlListView_GetHeader($hListView) ; das Handle von der Titelleiste des Listviews
GUICtrlSetFont($idListView, 10, 400, 0, 'Tahoma', 5) ; anderen Zeichensatz bitte
For $i = 0 To 1
	_GUICtrlListView_SetColumnWidth($hListView, $i, $aColWidth[$i]) ; ListView-Spaltenbreite setzen
Next
_GUICtrlListView_SetColumnWidth($hListView, 2, $LVSCW_AUTOSIZE_USEHEADER) ; ListView-Spaltenbreite setzen

; setze die Schalter aus den Einstellungen in den Menüs
If $Autostart = 1 Then
	GUICtrlSetState($auto, $GUI_CHECKED)
	If @Compiled Then
		If Not FileExists(@StartupDir & '\' & @ScriptName) Then
			FileCreateShortcut(@ScriptFullPath, @StartupDir & '\' & @ScriptName) ; Verknüpfung im Autostart erstellen
		EndIf
	EndIf
Else
	GUICtrlSetState($auto, $GUI_UNCHECKED)
	If @Compiled Then FileDelete(@StartupDir & '\' & @ScriptName & '.lnk') ; Verknüpfung löschen
EndIf
If $all = 1 Then
	GUICtrlSetState($show_all, $GUI_CHECKED)
Else
	GUICtrlSetState($show_all, $GUI_UNCHECKED)
EndIf
If $fast = 1 Then
	GUICtrlSetState($radio1, $GUI_CHECKED)
Else
	GUICtrlSetState($radio2, $GUI_CHECKED)
EndIf
If $block = 1 Then
	$bcheck = 1 ;Blockliste überwachen  (an)
	GUICtrlSetState($box1, $GUI_CHECKED)
Else
	$bcheck = 0 ;Blockliste überwachen  (aus)
	GUICtrlSetState($box1, $GUI_UNCHECKED)
EndIf
If $sort = 1 Then
	GUICtrlSetState($sort_all, $GUI_CHECKED)
Else
	GUICtrlSetState($sort_all, $GUI_UNCHECKED)
EndIf
If $tree = 1 Then
	GUICtrlSetState($tree_all, $GUI_CHECKED)
Else
	GUICtrlSetState($tree_all, $GUI_UNCHECKED)
EndIf
If $autotray = 1 Then
	GUICtrlSetState($starttray, $GUI_CHECKED)
Else
	GUICtrlSetState($starttray, $GUI_UNCHECKED)
EndIf
If $ttip = 1 Then
	GUICtrlSetState($extraInfo, $GUI_CHECKED)
Else
	GUICtrlSetState($extraInfo, $GUI_UNCHECKED)
EndIf
If $info2 = 1 Then
	GUICtrlSetState($noInfo, $GUI_CHECKED)
Else
	GUICtrlSetState($noInfo, $GUI_UNCHECKED)
EndIf
If $close = 1 Then
	GUICtrlSetState($tray, $GUI_CHECKED)
Else
	GUICtrlSetState($tray, $GUI_UNCHECKED)
EndIf
Switch $again
	Case 0
		GUICtrlSetState($scan_every[0], $GUI_CHECKED)
	Case 1
		GUICtrlSetState($scan_every[1], $GUI_CHECKED)
	Case 2
		GUICtrlSetState($scan_every[2], $GUI_CHECKED)
	Case 4
		GUICtrlSetState($scan_every[3], $GUI_CHECKED)
	Case 6
		GUICtrlSetState($scan_every[4], $GUI_CHECKED)
	Case 8
		GUICtrlSetState($scan_every[5], $GUI_CHECKED)
	Case 10
		GUICtrlSetState($scan_every[6], $GUI_CHECKED)
EndSwitch
If $memory_sh = 1 Then
	GUICtrlSetState($memory_show, $GUI_CHECKED)
	$memoryinfo = 1
	$count = 3
Else
	GUICtrlSetState($memory_show, $GUI_UNCHECKED)
	$memoryinfo = 0
	$count = 58
EndIf

WinMove($hGUI, '', $iLeft, $iTop, $iWidth, $iHeight) ; das Hauptfenster an die gespeicherten Daten anpassen
If $fMaximize Then WinSetState($hGUI, '', @SW_MAXIMIZE) ; das Hauptfenster maximieren, wenn das so gespeichert war

; Statuszeile
Global $aParts[3] = [400, 520, -1], $aText[2] = ['Bereit.', 'Prozesse: 0'], $ahIcons[6] ; Variablen fuer die Statuszeile
$ahIcons[0] = _WinAPI_LoadShell32Icon(144) ; Ready(Haken)-Icon aus der "shell32.dll" laden
If @OSVersion = 'WIN_XP' Then $ahIcons[0] = _WinAPI_LoadShell32Icon(-246) ; XP-Ready-Icon aus der "shell32.dll" laden
$ahIcons[1] = _WinAPI_LoadShell32Icon(77) ; Ausrufe-Icon aus der "shell32.dll" laden
If @OSVersion = 'WIN_XP' Then $ahIcons[1] = _WinAPI_LoadShell32Icon(221) ; XP-Ausrufe-Icon-Icon aus der "shell32.dll" laden
$ahIcons[2] = _WinAPI_LoadShell32Icon(109) ; Stop-Icon aus der "shell32.dll" laden
$ahIcons[3] = _WinAPI_LoadShell32Icon(166) ; Statistik-Icon aus der "shell32.dll" laden
$ahIcons[4] = _WinAPI_LoadImage(0, $Icon2, $IMAGE_ICON, 16, 16, $LR_LOADFROMFILE) ; Haken-Icon aus der "shell32.dll" laden
$ahIcons[5] = _WinAPI_LoadShell32Icon(12) ; Speicher-Icon aus der "shell32.dll" laden
Global $hStatus = _GUICtrlStatusBar_Create($hGUI, $aParts, $aText, $SBARS_SIZEGRIP) ; Statuszeile erstellen
_GUICtrlStatusBar_SetIcon($hStatus, 0, $ahIcons[0]) ; Icon fuer die linke Seite der Statuszeile setzen
_GUICtrlStatusBar_SetIcon($hStatus, 1, $ahIcons[3]) ; Icon fuer die Mitte der Statuszeile setzen

; hier ein kleines Tray Menü erstellen
$rem = TrayCreateItem($sTitle & $sVersion)
TrayItemSetState(-1, $TRAY_DISABLE)
$break = TrayCreateItem("Abschießen stoppen!")
TrayItemSetOnEvent(-1, '_Stop_Kill')
$showprog = TrayCreateItem("Verstecke Hauptfenster")
TrayItemSetOnEvent(-1, '_Show_Main_Window')
TrayCreateItem('')
$computer = TrayCreateMenu("Computer")
TrayCreateItem("Computer neu starten", $computer)
TrayItemSetOnEvent(-1, '_restart')
TrayCreateItem("Computer herunter fahren", $computer)
TrayItemSetOnEvent(-1, '_shutdown0')
$exititem = TrayCreateItem("Exit")
TrayItemSetOnEvent(-1, '_End2')
TrayItemSetState($break, $TRAY_DISABLE)
TraySetState($TRAY_ICONSTATE_SHOW)

_BlockListCheck() ; die Blockliste, falls vorhanden überprüfen
_message_times() ; Zeiten für Tray-Nachrichten festlegen
_Show_Memory_or_Clock() ; Uhrzeit oder Speicherverbrauch Anzeigen
_Taskscan() ; ;Anzahl der System-Prozesse in LiestView eintragen und Anzeigen lassen
If $memory_sh = 0 Then _GUICtrlStatusBar_SetIcon($hStatus, 2, $ahIcons[4]) ; Icon fuer Uhr setzen
If $memory_sh = 1 Then _GUICtrlStatusBar_SetIcon($hStatus, 2, $ahIcons[5]) ; Icon fuer Speicher setzen

If $autotray = 0 Then
	$show = 0
	GUISetState(@SW_SHOW, $hGUI) ; das Hauptfenster anzeigen
	If $fMaximize Then _Control_Change() ; einige Controls neu Positionieren
Else
	TrayItemSetText($showprog, "Zeige Hauptfenster")
	$show = 1
EndIf
TraySetToolTip($sTitle & ' ist gestartet')

; so noch einiges Starten lassen...
_SysRoutines_On() ; GUIRegisterMsg & AdlibRegister
GUIRegisterMsg($WM_SIZE, '_WM_SIZE') ; Funktion registrieren, die aufgerufen wird, wenn das Fenster in der Groesse veraendert wird

; ---main-loop
While Sleep(60)
	If $block = 1 Then _blockcheck() ; Check in List of blocked Processes ...
	If $go = 1 Then _running()
	If @SEC <> $time Then
		$time = @SEC
		_Show_Memory_or_Clock() ; Uhrzeit oder den Speicherverbrauch anzeigen
		$count += 1
		$count2 += 1
		If $count2 > 10 Then $count2 = 0
		If BitAND(GUICtrlRead($scan_every[1]), $GUI_CHECKED) = $GUI_CHECKED And $count2 = 1 Then
			If $go = 0 Then _Taskscan2() ; when not running...
			$count2 = 0
			If $bcheck = 1 Then _Check_Box() ; Prüfe was ausgewählt wurde...
		ElseIf BitAND(GUICtrlRead($scan_every[2]), $GUI_CHECKED) = $GUI_CHECKED And $count2 = 2 Then
			If $go = 0 Then _Taskscan2()
			$count2 = 0
			If $bcheck = 1 Then _Check_Box() ; Prüfe was ausgewählt wurde...
		ElseIf BitAND(GUICtrlRead($scan_every[3]), $GUI_CHECKED) = $GUI_CHECKED And $count2 = 4 Then
			If $go = 0 Then _Taskscan2()
			$count2 = 0
			If $bcheck = 1 Then _Check_Box() ; Prüfe was ausgewählt wurde...
		ElseIf BitAND(GUICtrlRead($scan_every[4]), $GUI_CHECKED) = $GUI_CHECKED And $count2 = 6 Then
			If $go = 0 Then _Taskscan2()
			$count2 = 0
			If $bcheck = 1 Then _Check_Box() ; Prüfe was ausgewählt wurde...
		ElseIf BitAND(GUICtrlRead($scan_every[5]), $GUI_CHECKED) = $GUI_CHECKED And $count2 = 8 Then
			If $go = 0 Then _Taskscan2()
			$count2 = 0
			If $bcheck = 1 Then _Check_Box() ; Prüfe was ausgewählt wurde...
		ElseIf BitAND(GUICtrlRead($scan_every[6]), $GUI_CHECKED) = $GUI_CHECKED And $count2 = 10 Then
			If $go = 0 Then _Taskscan2()
			$count2 = 0
			If $bcheck = 1 Then _Check_Box() ; Prüfe was ausgewählt wurde...
		EndIf
	EndIf
	If $go = 0 And $count = 1 And BitAND(GUICtrlRead($box1), $GUI_CHECKED) = $GUI_CHECKED Then
		$block = 1
		_Taskscan2()
		$count = 0
	EndIf
WEnd

Func _Show_Memory_or_Clock()
	Switch $memory_sh
		Case 1
			If $count = 4 Then ; every 5 seconds
				$mem = MemGetStats()
				; in Kilobytes
				;$aGesamt = 'Speicher ' & $mem[0] & '% / ' & $mem[2] & ' KB' & ' / ' & $mem[1] & ' KB'
				;_GUICtrlStatusBar_SetText($hStatus, $aGesamt, 2) ; die rechte Statuszeile aktualisieren
				;
				; oder in Megabytpes
				$aMemTot = $mem[1] - $mem[2]
				$aGesamt = Round($aMemTot / $mem[1] * 100, 2)
				$backWert = Round(($aMemTot / 1024) / 1024, 3) ;ausgabe der Ram werte
				_GUICtrlStatusBar_SetText($hStatus, "RAM Auslastung :   " & $backWert & " GB  ~  " & $aGesamt & "%", 2) ; die rechte Statuszeile aktualisieren
				$count = 0
			EndIf
		Case 0
			If $count = 59 Or $old_min <> @MIN Or $old_std <> @HOUR Then
				_GUICtrlStatusBar_SetText($hStatus, 'Uhrzeit  ' & @HOUR & ":" & @MIN, 2) ; die rechte Statuszeile aktualisieren
				$old_std = @HOUR
				$old_min = @MIN
				$count = 0
			EndIf
	EndSwitch
EndFunc   ;==>_Show_Memory_or_Clock

Func _Auto_Refresh()
	Local $iCtrlID = @GUI_CtrlId
	$count2 = 0
	For $k = 0 To 6
		GUICtrlSetState($scan_every[$k], $GUI_UNCHECKED)
	Next
	Switch $iCtrlID
		Case $scan_every[0]
			GUICtrlSetState($scan_every[0], $GUI_CHECKED)
			$again = 0 ; nich mehr auf neue Prozesse prüfen, aber einmal noch
			$count2 = 0
			_Taskscan() ; alle Prozesse neu einlesen
		Case $scan_every[1]
			GUICtrlSetState($scan_every[1], $GUI_CHECKED)
			$again = 1 ; jede Sekunde auf neue Prozesse prüfen
			$count2 = 0
		Case $scan_every[2]
			GUICtrlSetState($scan_every[2], $GUI_CHECKED)
			$again = 2 ; alle 2 Sekunden auf neue Prozesse prüfen
			$count2 = 0
		Case $scan_every[3]
			GUICtrlSetState($scan_every[3], $GUI_CHECKED)
			$again = 4 ; alle 4 Sekunden auf neue Prozesse prüfen
			$count2 = 0
		Case $scan_every[4]
			GUICtrlSetState($scan_every[4], $GUI_CHECKED)
			$again = 6 ; alle 6 Sekunden auf neue Prozesse prüfen
			$count2 = 0
		Case $scan_every[5]
			GUICtrlSetState($scan_every[5], $GUI_CHECKED)
			$again = 8 ; alle 8 Sekunden auf neue Prozesse prüfen
			$count2 = 0
		Case $scan_every[6]
			GUICtrlSetState($scan_every[6], $GUI_CHECKED)
			$again = 10 ; alle 10 Sekuznden  auf neue Prozesse prüfen
			$count2 = 0
	EndSwitch
EndFunc   ;==>_Auto_Refresh

Func _running()
	Local $prog, $PID, $z
	If BitAND(GUICtrlRead($radio2), $GUI_CHECKED) = $GUI_CHECKED Then _Timer()
	If BitAND(GUICtrlRead($radio1), $GUI_CHECKED) = $GUI_CHECKED Then
		$zaehler = $backupZ - 1
		$zaehler += 2
	EndIf
	If $zaehler = $backupZ + 1 Then
		For $i = 0 To UBound($daten) - 1
			If $sel[$i] = 1 Then
				$prog = _GUICtrlListView_GetItem($idListView, $i)
				$prog[3] = StringLower($prog[3])
				_ComputerGetServices($aServicesInfo, "All") ; alle Services in ein Array laden
				If $prog[3] = "explorer.exe" Then
					_SysRoutines_Off()
					If MsgBox(1 + 32, $sTitle & $sVersion, "Willst Du wirklich den 'explorer' Prozess beenden?", 0, $hGUI) = 1 Then
						;					...nothings
					Else
						GUICtrlSetState($idListView, $GUI_ENABLE)
						_Stop_Kill()
						_SysRoutines_On()
						SetError(0)
						Return 0
					EndIf
				EndIf
				$PID = ProcessExists($prog[3])
				If $PID Then
					If WinActive($sTitle & $sVersion) Then
						_GUICtrlStatusBar_SetIcon($hStatus, 0, $ahIcons[1]) ; Icon setzen
						_GUICtrlStatusBar_SetText($hStatus, $prog[3] & ' wird beendet...', 0)
						If $info2 = 1 Then
							TrayTip("", $prog[3] & ' wird beendet...', 1)
							AdlibRegister("No_Tip", 2000) ; 2 seconds
						EndIf
						Sleep(1000)
					ElseIf $info2 = 1 Then
						TrayTip("", $prog[3] & ' wird beendet...', 1)
						AdlibRegister("No_Tip", 2000) ; 2 seconds
					EndIf
					$tasklist = ProcessList($prog[3])
					If $tree = 1 Then
						For $z = $tasklist[0][0] To 1 Step -1
							_service_process_name($prog[3], $PID) ; prüfe welcher Service geschlossen wird
							If $service_exit = 0 Then
								$cl = ProcessClose($prog[3])
								Sleep(50)
							Else
								RunWait(@ComSpec & " /c " & 'sc stop ' & $servicekill & '', "", @SW_HIDE) ; kill the service !
								Sleep(50)
							EndIf
						Next
					Else
						If $service_exit = 0 Then
							$cl = ProcessClose($prog[3])
						Else
							RunWait(@ComSpec & " /c " & 'sc stop ' & $servicekill & '', "", @SW_HIDE) ; kill the service !
							Sleep(50)
						EndIf
					EndIf
				ElseIf Not ProcessExists($prog[3]) And $tree = 0 Then
					If WinActive($sTitle & $sVersion) Then
						_GUICtrlStatusBar_SetIcon($hStatus, 0, $ahIcons[1]) ; Icon setzen
						_GUICtrlStatusBar_SetText($hStatus, $prog[3] & ' ist nicht mehr vorhanden...', 0)
						If $info2 = 1 Then
							TrayTip("", $prog[3] & ' ist nicht mehr vorhanden...', 3)
							AdlibRegister("No_Tip", 3000) ; 3 seconds
						EndIf
						Sleep(3000)
					ElseIf $info2 = 1 Then
						TrayTip("", $prog[3] & ' ist nicht mehr vorhanden...', 3)
						AdlibRegister("No_Tip", 3000) ; 3 seconds
					EndIf
				EndIf
				_GUICtrlListView_SetItemChecked($idListView, $i, False)
				_GUICtrlListView_SetItemDropHilited($idListView, $i, False)
				$sel[$i] = 0
			EndIf
		Next
		_Taskscan() ; check Tasklist
		$Process_List = _System_Processlist()
		_GUICtrlStatusBar_SetText($hStatus, 'Prozesse: ' & $Process_List[0][0], 1) ; die rechte Statuszeile aktualisieren
		$go = 0
		$t = -1
		$zaehler = 0
		If $tray_on = 1 Then TrayItemSetState($break, $TRAY_DISABLE)
		GUICtrlSetState($box1, $GUI_ENABLE)
		GUICtrlSetState($radio1, $GUI_ENABLE)
		GUICtrlSetState($radio2, $GUI_ENABLE)
		GUICtrlSetState($input, $GUI_ENABLE)
		GUICtrlSetState($updown, $GUI_ENABLE)
		_changebutton()
	EndIf
EndFunc   ;==>_running

Func _Timer()
	If @SEC <> $t Then ; Wenn Macro @SEC ungleich Variabel $T, dann ist eine Sekunde vergangen
		$zaehler += 1
		$t = @SEC
		If WinActive($sTitle & $sVersion) Then
			If $backupZ - $zaehler > -1 Then
				_GUICtrlStatusBar_SetIcon($hStatus, 0, $ahIcons[1]) ; Icon fuer die linke Seite der Statuszeile setzen
				_GUICtrlStatusBar_SetText($hStatus, 'ausgewählte Prozesse werden in ' & $backupZ - $zaehler & ' Sekunden beendet', 0) ; Laufzeit anzeigen
				If $info2 = 1 Then
					_TrayShow()
				EndIf
			EndIf
		ElseIf Not WinActive($sTitle & $sVersion) And $info2 = 1 Then
			_TrayShow()
		EndIf
	EndIf
EndFunc   ;==>_Timer

Func _TrayShow()
	For $i = $tmp[0] To 1 Step -1
		If $backupZ - $zaehler = $tmp[$i] And $info2 = 1 Then
			If $backupZ - $zaehler < 60 Then
				$oldinput = $backupZ
				$backupZ = 60
				_message_times()
				$backupZ = $oldinput
			EndIf
			If $backupZ - $zaehler > -1 Then
				TrayTip("", 'ausgewählte Prozesse werden in ' & $backupZ - $zaehler & ' Sekunden beendet', 0)
				AdlibRegister("No_Tip", 3000) ; 3 seconds
			EndIf
		EndIf
	Next
EndFunc   ;==>_TrayShow

Func No_Tip()
	AdlibUnRegister("No_Tip") ; ausschalten
	TrayTip("", "", 0) ; no TrayTip
EndFunc   ;==>No_Tip

Func _SysRoutines_On()
	GUIRegisterMsg($WM_NOTIFY, '_WM_NOTIFY') ; Funktion registrieren, um einen Doppelklick auf das Listview auswerten zu koennen
EndFunc   ;==>_SysRoutines_On

Func _SysRoutines_Off()
	GUIRegisterMsg($WM_NOTIFY, "") ; Funktion de-registrieren
EndFunc   ;==>_SysRoutines_Off

Func _End2()
	$close = 0
	_End()
EndFunc   ;==>_End2

Func _End() ; speichere die Optionen und Programm ende ...
	ToolTip('') ; kein ToolTip mehr
	If $close = 0 Then ; Programm nur beenden wenn Variable ($close = 1)
		_SysRoutines_Off()
		If BitAND(GUICtrlRead($radio1), $GUI_CHECKED) = $GUI_CHECKED Then $fast = 1
		If BitAND(GUICtrlRead($radio2), $GUI_CHECKED) = $GUI_CHECKED Then $fast = 0
		If BitAND(GUICtrlRead($box1), $GUI_CHECKED) = $GUI_CHECKED Then $block = 1
		If BitAND(GUICtrlRead($box1), $GUI_UNCHECKED) = $GUI_UNCHECKED Then $block = 0
		If BitAND(GUICtrlRead($tray), $GUI_CHECKED) = $GUI_CHECKED Then $close = 1
		If BitAND(GUICtrlRead($tray), $GUI_UNCHECKED) = $GUI_UNCHECKED Then $close = 0
		If BitAND(GUICtrlRead($noInfo), $GUI_CHECKED) = $GUI_CHECKED Then $info2 = 1
		If BitAND(GUICtrlRead($noInfo), $GUI_UNCHECKED) = $GUI_UNCHECKED Then $info2 = 0
		If BitAND(GUICtrlRead($memory_show), $GUI_CHECKED) = $GUI_CHECKED Then $memory_sh = 1
		If BitAND(GUICtrlRead($memory_show), $GUI_UNCHECKED) = $GUI_UNCHECKED Then $memory_sh = 0
		$fMaximize = BitAND(WinGetState($hGUI), 32) = 32 ; ermitteln, ob das Hauptfenster maximiert wurde
		IniWrite($sInifile, 'Settings', 'Maximize', $fMaximize) ; den Maximiert-Status abspeichern
		Local $aWinPos = WinGetPos($hGUI) ; die letzte Position des Hauptfensters holen
		If Not $fMaximize And $aWinPos[0] > -32000 Then ; wenn das Hauptfenster weder maximiert noch minimiert war, dann...
			IniWrite($sInifile, 'Settings', 'Left', $aWinPos[0]) ; die Position abspeichern
			IniWrite($sInifile, 'Settings', 'Top', $aWinPos[1])
			IniWrite($sInifile, 'Settings', 'Width', $aWinPos[2]) ; die Fenstergroesse abspeichern
			IniWrite($sInifile, 'Settings', 'Height', $aWinPos[3])
		EndIf
		IniWrite($sInifile, 'Settings', 'again', $again)
		IniWrite($sInifile, 'Settings', 'allprocesses', $all)
		IniWrite($sInifile, 'Settings', 'autostart', $Autostart)
		IniWrite($sInifile, 'Settings', 'block', $block)
		IniWrite($sInifile, 'Settings', 'close', $close)
		If Not $aWinPos[0] > -32000 Then ; wenn das Hauptfenster nicht minimiert war, dann...
			IniWrite($sInifile, 'Settings', 'countdown', GUICtrlRead($input)) ; letzte Zeit holen und abspeichern
		Else
			IniWrite($sInifile, 'Settings', 'countdown', $backupZ) ; letzte gespeicherte Zeitangabe abspeichern
		EndIf
		IniWrite($sInifile, 'Settings', 'ttip', $ttip)
		IniWrite($sInifile, 'Settings', 'infos', $info2)
		IniWrite($sInifile, 'Settings', 'fast', $fast)
		IniWrite($sInifile, 'Settings', 'memory', $memory_sh)
		IniWrite($sInifile, 'Settings', 'sort', $sort)
		IniWrite($sInifile, 'Settings', 'tray', $autotray)
		IniWrite($sInifile, 'Settings', 'tree', $tree)
		IniWrite($sInifile, 'Settings', 'unlock', $unlocker)
		; Minstestgrenzen der Spaltenbreite unterschritten ?
		If $aColWidth[0] < 128 Then $aColWidth[0] = 128
		If $aColWidth[1] < 40 Then $aColWidth[1] = 40
		If $aColWidth[2] < 88 Then $aColWidth[2] = 88
		For $i = 0 To $iColCount - 1 ; die Spaltenbreiten speichern
			IniWrite($sInifile, 'Settings', $i, $aColWidth[$i])
		Next
		GUIDelete($hGUI) ; Hauptfenster schliesen
		Exit
	Else
		$show = 0
		_Show_Main_Window()
	EndIf
EndFunc   ;==>_End

Func _Start()
	ToolTip('') ; kein ToolTip mehr
	Select
		Case $go = 1
			$go = 0
			$t = -1
			$zaehler = 0
			GUICtrlSetState($box1, $GUI_ENABLE)
			GUICtrlSetState($radio1, $GUI_ENABLE)
			GUICtrlSetState($radio2, $GUI_ENABLE)
			GUICtrlSetState($input, $GUI_ENABLE)
			GUICtrlSetState($updown, $GUI_ENABLE)
			GUICtrlSetState($hListView, $GUI_ENABLE)
			_changebutton()
		Case $go = 0
			$backupZ = GUICtrlRead($input)
			GUICtrlSetState($box1, $GUI_DISABLE)
			GUICtrlSetState($radio1, $GUI_DISABLE)
			GUICtrlSetState($radio2, $GUI_DISABLE)
			GUICtrlSetState($input, $GUI_DISABLE)
			GUICtrlSetState($updown, $GUI_DISABLE)
			$zaehler = -1
			_supervise_on()
	EndSelect
EndFunc   ;==>_Start

Func _supervise_on() ; Knopf für das Abschießen gedrückt
	_Check_Box() ; Prüfe was ausgewählt wurde...
	For $i = 0 To UBound($daten) - 1
		If $sel[$i] = 1 Then
			If $go = 0 Then
				$go = 1
				_changebutton(1)
			EndIf
		EndIf
	Next
	If $go = 0 Then
		GUISetState(@SW_DISABLE, $hGUI)
		If MsgBox(64, 'Nichts zum abschießen!', "Kein Prozess war ausgewählt!", 0, $hGUI) = 1 Then
			GUICtrlSetState($box1, $GUI_ENABLE)
			GUICtrlSetState($radio1, $GUI_ENABLE)
			GUICtrlSetState($radio2, $GUI_ENABLE)
			GUICtrlSetState($input, $GUI_ENABLE)
			GUICtrlSetState($updown, $GUI_ENABLE)
			_changebutton()
			GUISetState(@SW_ENABLE, $hGUI)
			WinActivate($sTitle, '')
		EndIf
	EndIf
EndFunc   ;==>_supervise_on

Func _changebutton($h = 0) ; Start / Stop - Button ändern
	_GUICtrlStatusBar_SetText($hStatus, 'Bereit.', 0) ; die linke Statuszeile aktualisieren
	_GUICtrlStatusBar_SetIcon($hStatus, 0, $ahIcons[0]) ; das Icon setzen
	If $h = 0 Then
		GUICtrlSetData($start, "Prozesse abschießen")
		TrayItemSetState($break, $TRAY_DISABLE)
	Else
		GUICtrlSetData($start, "Abschießen stoppen!")
		TrayItemSetState($break, $TRAY_ENABLE)
	EndIf
EndFunc   ;==>_changebutton

Func _Stop_Kill()
	GUICtrlSetState($box1, $GUI_ENABLE)
	GUICtrlSetState($radio1, $GUI_ENABLE)
	GUICtrlSetState($radio2, $GUI_ENABLE)
	GUICtrlSetState($input, $GUI_ENABLE)
	GUICtrlSetState($updown, $GUI_ENABLE)
	_changebutton()
	$go = 0
	$t = -1
	$zaehler = 0
	If $info2 = 1 Then
		TrayTip("", $sTitle & ' abschießen wurde gestopt!', 3)
		Sleep(3500)
		TrayTip("", "", 0)
	EndIf
EndFunc   ;==>_Stop_Kill

Func _restart()
	_shutdown(1)
EndFunc   ;==>_restart

Func _shutdown0()
	_shutdown(0)
EndFunc   ;==>_shutdown0

Func _shutdown($a)
	ToolTip('') ; kein ToolTip mehr
	Local $countstring, $abruch = 0
	GUISetState(@SW_DISABLE, $hGUI) ; das Hauptfenster deaktivieren
	If $a = 0 Then $sMsg = 'Computer Ausschalten ?'
	If $a = 1 Then $sMsg = 'Computer neu starten ?'

	$iOldEventMode = Opt('GUIOnEventMode', 0) ; auf den MessageLoop-Modus umschalten (vorherigen Status merken)
	$hConfirmGui = GUICreate(StringFormat('%s - ' & $sMsg, $sTitle), 275, 120, -1, -1, BitOR($WS_CAPTION, $WS_POPUPWINDOW), Default, $hGUI)
	GUISetBkColor(0x08768E, $hConfirmGui) ; die Hintergrundfarbe fuer das Nachfragefenster setzen
	GUISetIcon('shell32.dll', -24, $hConfirmGui) ; Fenstericon setzen
	GUISetFont(9.0, 400, 0, 'Verdana', $hConfirmGui, 5) ; den Standard-Zeichensatz fuer das Nachfragefenster setzen
	For $i = 0 To 10
		$countstring = $countstring & $i & Chr(32) & Chr(32) & Chr(32) & Chr(32) ; die 10 Zahlen und einige Leerzeichen (SPACE)
	Next
	$txt = 'Der Computer wird '
	If $a = 0 Then $txt &= 'ausgeschaltet...'
	If $a = 1 Then $txt &= 'neu gestartet...'
	GUICtrlCreateLabel($txt, 20, 5)
	GUICtrlSetColor(-1, 0xFFFFFFF) ; die Textfarbe setzen
	GUICtrlCreateLabel($countstring, 8, 35)
	GUICtrlSetColor(-1, 0xFFF000) ; die Textfarbe setzen
	$idProgressbar = GUICtrlCreateProgress(8, 55, 256, 20)
	$i = 100
	GUICtrlSetData($idProgressbar, ($i))
	$abrr = GUICtrlCreateButton("Abbruch", 80, 85, 100)

	GUISetState(@SW_SHOW, $hConfirmGui) ; das Nachfragefenster anzeigen

	While 1
		Switch GUIGetMsg()
			Case $abrr
				$abruch = 1
				ExitLoop
		EndSwitch
		GUICtrlSetData($idProgressbar, ($i))
		Sleep(60)
		$i -= 1
		If $i = 0 Then ExitLoop
	WEnd
	If $abruch = 0 Then ; nur wenn nicht auf den Abbruch-Button geklick wurde, dann -
		If $a = 0 Then RunWait($extrapfad & "shutdown.exe /s /t 5", "", @SW_HIDE) ; -> Computer neu zu starten
		If $a = 1 Then RunWait($extrapfad & "shutdown.exe /r /t 5", "", @SW_HIDE) ; -> Computer herunter fahren
		Exit
	EndIf
	Opt('GUIOnEventMode', $iOldEventMode) ; und den alten EventModus wiederherstellen
	GUIDelete($hConfirmGui) ; das Nachfragefenster loeschen
	GUISetState(@SW_ENABLE, $hGUI) ; das Hauptfenster wieder aktivieren
	WinActivate($sTitle) ; Hauptfenster in den Vordergrund holen
EndFunc   ;==>_shutdown

Func _Taskscan()
	Dim $daten[1], $sel[1], $oldname[1]
	Local $name, $l, $ww, $nxt, $j, $add, $old, $prog
	For $i = 0 To _GUICtrlListView_GetItemCount($hListView)
		$old = _GUICtrlListView_GetItemChecked($hListView, $i)
		If $old = 1 Then
			$prog = _GUICtrlListView_GetItem($hListView, $i)
			$oldname[$ww] = $prog[3] ; merke markierter Name
			ReDim $oldname[UBound($oldname) + 1] ; Verändert die Größe des bestehenden Array
			$ww += 1 ; Zähler erhöhen
		EndIf
	Next
	_GUICtrlListView_BeginUpdate($hListView)
	_GUICtrlListView_DeleteAllItems($hListView)
	$Process_List = _System_Processlist() ; Taskliste holen
	$listlenght = $Process_List[0][0]
	If $sort = 1 Then _ArraySort($Process_List, 0, 1, UBound($Process_List))
	$name = ''
	$l = 0
	$nxt = 0
	$add = 0
	If $all = 0 Then $add = 1
	For $i = $all + $add To $listlenght
		$name = $Process_List[$i][0]
		For $j = 0 To UBound($forbidden_process) - 1
			If $name = $forbidden_process[$j] And $all = 0 Then
				$nxt = 1
				ExitLoop
			Else
				$nxt = 0
			EndIf
		Next
		If $nxt = 0 Then
			If $Process_List[$i][1] = 0 Then ; PID 0 ?
				$name = 'System Idle Process'
				$Description = 'N/A'
			EndIf
			ReDim $daten[UBound($daten) + 1] ; Größe des Array ändern
			ReDim $sel[UBound($sel) + 1] ; Größe des Array ändern
			; Prozess-Name / Prozess-PID' / Prozess-Pfad
			$daten[$l] = GUICtrlCreateListViewItem($Process_List[$i][0] & "|" & $Process_List[$i][1] & "|" & $Process_List[$i][2], $idListView)
			$sel[$l] = 0
			$l += 1 ; Zähler erhöhen
		EndIf
	Next
	_GUICtrlListView_EndUpdate($hListView)
	If $ww > 0 Then
		For $i = 0 To _GUICtrlListView_GetItemCount($hListView)
			$prog = _GUICtrlListView_GetItem($hListView, $i)
			For $j = 0 To $ww
				If $prog[3] = $oldname[$j] Then ; Name gefunden ...
					_GUICtrlListView_SetItemChecked($hListView, $i)
					_GUICtrlListView_SetItemState($hListView, $i, $LVIS_DROPHILITED, $LVIS_DROPHILITED)
					$sel[$i] = 1
				EndIf
			Next
		Next
	EndIf
	If $traymenu = 1 Then $traymenu = 0
	_GUICtrlStatusBar_SetText($hStatus, 'Prozesse: ' & $listlenght, 1) ; die rechte Statuszeile aktualisieren
	If $iHotItem <> -1 Then _GUICtrlListView_Scroll($hListView, 0, Int($iHotItem * 16)) ; den Fokus wieder auf Position bringen
EndFunc   ;==>_Taskscan

Func _Taskscan2() ; neuer Prozess ?
	Local $ProcessList, $listlenght2
	$ProcessList = _System_Processlist() ; aktuellere Taskliste holen
	$listlenght2 = $ProcessList[0][0] ; die Anzahl der Prozesse
	If $listlenght2 <> $listlenght Then ; vergleichen alte mit neuer Anzahl der Prozesse
		_Taskscan() ; scan new
		_GUICtrlStatusBar_SetText($hStatus, 'Prozesse: ' & $listlenght2, 1) ; die rechte Statuszeile aktualisieren
	EndIf
	If $block = 0 And BitAND(GUICtrlRead($box1), $GUI_CHECKED) = $GUI_CHECKED Then
		$block = 1
		_blockcheck()
	EndIf
EndFunc   ;==>_Taskscan2

Func _blockcheck() ; hier werden alle in der Blockliste eingetragende Prozesse abgeschossen...
	Local $file, $line, $PID
	If $block = 1 And BitAND(GUICtrlRead($box1), $GUI_CHECKED) = $GUI_CHECKED Then
		$block = 0
		If FileExists($blocklist) Then
			$file = FileOpen($blocklist, $FO_READ) ; Lesemodus
			If $file <> -1 Then
				$line = FileReadLine($file)
				If $line = "[Blocklist]" Then
					_ComputerGetServices($aServicesInfo, "All") ; get all Services in an array
					While 1
						$line = FileReadLine($file)
						If @error = -1 Or $line = '' Then ExitLoop
						If StringRight($line, 4) = '.exe' Then
							$tasklist = ProcessList($line)
							$PID = ProcessExists($line)
							If $tree = 1 Then
								For $z = $tasklist[0][0] To 1 Step -1
									_service_process_name($line, $PID) ; ein Service-Prozess zum abschießen ?
									If $service_exit = 0 Then
										$cl = ProcessClose($line)
										If $cl <> 1 Then
											_GUICtrlStatusBar_SetIcon($hStatus, 0, $ahIcons[2]) ; Icon fuer die linke Seite der Statuszeile setzen
											GUISetCursor(15, $GUI_CURSOR_OVERRIDE, $hGUI) ; und den Mauscursor als rotierenden Zeiger anzeigen
											_GUICtrlStatusBar_SetText($hStatus, 'Fehler, konnte ' & $line & ' nicht schließen!', 0) ; Hinweis in der Statuszeile
											Sleep(2500)
										EndIf
										Sleep(50)
									Else
										RunWait(@ComSpec & " /c " & 'sc stop ' & $servicekill & '', "", @SW_HIDE) ; kill the service !
										Sleep(50)
									EndIf
								Next
							Else
								If ProcessExists($line) Then
									If $service_exit = 0 Then
										$cl = ProcessClose($line)
										If $cl <> 1 Then
											_GUICtrlStatusBar_SetIcon($hStatus, 0, $ahIcons[2]) ; Icon fuer die linke Seite der Statuszeile setzen
											GUISetCursor(15, $GUI_CURSOR_OVERRIDE, $hGUI) ; und den Mauscursor als rotierenden Zeiger anzeigen
											_GUICtrlStatusBar_SetText($hStatus, 'Fehler, konnte ' & $line & ' nicht schließen!', 0) ; Hinweis in der Statuszeile
											Sleep(2500)
										EndIf
										Sleep(50)
									Else
										RunWait(@ComSpec & " /c " & 'sc stop ' & $servicekill & '', "", @SW_HIDE) ; kill the service !
										Sleep(50)
									EndIf
								EndIf
							EndIf
							_GUICtrlListView_SetItemChecked($idListView, $line, False)
							_GUICtrlListView_SetItemDropHilited($idListView, $line, False)
						EndIf
					WEnd
				EndIf
				FileClose($file)
			EndIf
		Else
			_NewBlockList() ; neue Blockliste erstellen
		EndIf
	ElseIf $block = 0 And BitAND(GUICtrlRead($box1), $GUI_UNCHECKED) = $GUI_UNCHECKED Then
		$block = 1
	EndIf
	GUISetCursor(2, $GUI_CURSOR_OVERRIDE, $hGUI) ; den Mauszeiger wieder zuruecksetzen
	_GUICtrlStatusBar_SetText($hStatus, 'Bereit.', 0) ; die linke Statuszeile aktualisieren
	_GUICtrlStatusBar_SetIcon($hStatus, 0, $ahIcons[0]) ; das Icon setzen
EndFunc   ;==>_blockcheck

Func _Min_Main_Window()
	If TrayItemGetText($showprog) = "Verstecke Hauptfenter" And $show = 0 Then
		TrayItemSetText($showprog, "Zeige Hauptfenter")
		$show = 1
		$tray_on = 1
	ElseIf TrayItemSetText($showprog, "Zeige Hauptfenter") And $show = 0 Then
		$show = 1
		$tray_on = 1
	ElseIf $show = 1 Then
		TrayItemSetText($showprog, "Verstecke Hauptfenter")
		$show = 0
		$tray_on = 0
	EndIf
EndFunc   ;==>_Min_Main_Window

Func _Show_Main_Window()
	If BitAND(WinGetState($sTitle), 16) Then ; wenn Hauptfenster minimiert
		WinActivate($sTitle) ; Hauptfenster in den Vordergrund holen
		If $show = 0 Then
			TrayItemSetText($showprog, "Zeige Hauptfenter")
		Else
			TrayItemSetText($showprog, "Verstecke Hauptfenter")
		EndIf
		$show = 0
		$tray_on = 0
	ElseIf $show = 0 Then
		$show = 1
		$tray_on = 1
		_SysRoutines_Off()
		$backupZ = GUICtrlRead($input)
		If $winInfo = 1 Then GUISetState(@SW_HIDE, $hInfoGui) ; Info-Fenster ausblenden, wenn vorhanden...
		GUISetState(@SW_HIDE, $hGUI) ; Hauptfenster ausblenden
		TrayItemSetText($showprog, "Zeige Hauptfenter")
		If $go = 0 Then
			TrayItemSetState($break, $TRAY_DISABLE)
		Else
			TrayItemSetState($break, $TRAY_ENABLE)
		EndIf
	Else
		$show = 0
		$tray_on = 0
		TrayItemSetText($showprog, "Verstecke Hauptfenter")
		WinActivate($sTitle) ; Hauptfenster in den Vordergrund holen
		GUISetState(@SW_SHOW, $hGUI) ; Hauptfenster einblenden
		If $winInfo = 1 Then ; Info-Fenster einblenden, wenn vorhanden...
			WinActivate($hInfoGui)
			GUISetState(@SW_SHOW, $hInfoGui)
		EndIf
		_SysRoutines_On()
	EndIf
EndFunc   ;==>_Show_Main_Window

Func _Memory_OnOff()
	Switch $memory_sh
		Case 1
			_GUICtrlStatusBar_SetIcon($hStatus, 2, $ahIcons[4]) ; Icon fuer die Uhrzeit setzen
			GUICtrlSetState($memory_show, $GUI_UNCHECKED)
			$memoryinfo = 0
			$memory_sh = 0
			$count = 58
		Case 0
			_GUICtrlStatusBar_SetIcon($hStatus, 2, $ahIcons[5]) ; Icon fuer den Speicher setzen
			GUICtrlSetState($memory_show, $GUI_CHECKED)
			$memoryinfo = 1
			$memory_sh = 1
			$count = 4
	EndSwitch
EndFunc   ;==>_Memory_OnOff

Func _Hide_when_close()
	Switch $close
		Case 0
			$close = 1
			GUICtrlSetState($tray, $GUI_CHECKED)
		Case 1
			$close = 0
			GUICtrlSetState($tray, $GUI_UNCHECKED)
	EndSwitch
EndFunc   ;==>_Hide_when_close

Func _Auto_Hide_to_Tray()
	Switch $autotray
		Case 0
			$show = 1
			$notray = 1
			$autotray = 1
			GUICtrlSetState($starttray, $GUI_CHECKED)
		Case 1
			$autotray = 0
			GUICtrlSetState($starttray, $GUI_UNCHECKED)
	EndSwitch
EndFunc   ;==>_Auto_Hide_to_Tray

Func _Trayinfos_OnOff()
	Switch $info2
		Case 0
			$info2 = 1
			GUICtrlSetState($noInfo, $GUI_CHECKED)
		Case 1
			$info2 = 0
			GUICtrlSetState($noInfo, $GUI_UNCHECKED)
	EndSwitch
EndFunc   ;==>_Trayinfos_OnOff

Func _Show_AllProcess_OnOff()
	Switch $all
		Case 0
			$all = 1
			GUICtrlSetState($show_all, $GUI_CHECKED)
			_Taskscan()
		Case 1
			$all = 0
			GUICtrlSetState($show_all, $GUI_UNCHECKED)
			_Taskscan()
	EndSwitch
EndFunc   ;==>_Show_AllProcess_OnOff

Func _Sort_AllProcess_OnOff()
	Switch $sort
		Case 0
			$sort = 1
			GUICtrlSetState($sort_all, $GUI_CHECKED)
			_Taskscan()
		Case 1
			$sort = 0
			GUICtrlSetState($sort_all, $GUI_UNCHECKED)
			_Taskscan()
	EndSwitch
EndFunc   ;==>_Sort_AllProcess_OnOff

Func _MyToolTip_OnOff()
	Switch $ttip
		Case 0
			$ttip = 1
			GUICtrlSetState($extraInfo, $GUI_CHECKED)
		Case 1
			$ttip = 0
			GUICtrlSetState($extraInfo, $GUI_UNCHECKED)
			ToolTip('') ; kein ToolTip mehr
	EndSwitch
EndFunc   ;==>_MyToolTip_OnOff

Func _Autostart_with_Windows()
	If $Autostart = 0 Then
		$Autostart = 1
		GUICtrlSetState($auto, $GUI_CHECKED) ; Wenn Autostart gesetzt,  dann einen Haken neben den Menüeintrag setzen
		If @Compiled Then FileCreateShortcut(@ScriptFullPath, @StartupDir & '\' & @ScriptName) ; Verknüpfung im Autostart erstellen
	Else
		$Autostart = 0
		GUICtrlSetState($auto, $GUI_UNCHECKED) ; Wenn Autostart nicht gesetzt,  dann den Haken entfernen
		If @Compiled Then FileDelete(@StartupDir & '\' & @ScriptName & '.lnk') ; Verknüpfung löschen
	EndIf
EndFunc   ;==>_Autostart_with_Windows

Func _Kill_Tree_OnOff()
	Switch $tree
		Case 0
			$tree = 1
			GUICtrlSetState($tree_all, $GUI_CHECKED)
		Case 1
			$tree = 0
			GUICtrlSetState($tree_all, $GUI_UNCHECKED)
	EndSwitch
EndFunc   ;==>_Kill_Tree_OnOff

Func _Checkbox()
	If BitAND(GUICtrlRead($radio1), $GUI_UNCHECKED) = $GUI_UNCHECKED Or BitAND(GUICtrlRead($radio2), $GUI_CHECKED) = $GUI_CHECKED And BitAND(GUICtrlRead($box1), $GUI_CHECKED) = $GUI_CHECKED Then
		GUICtrlSetState($box1, $GUI_CHECKED)
		GUICtrlSetState($radio1, $GUI_CHECKED)
		GUICtrlSetState($radio2, $GUI_UNCHECKED)
		$bcheck = 1 ; Blockliste überwachen (an)
		$count = 0
		_BlockListCheck() ; die Blockliste, falls vorhanden überprüfen
	ElseIf BitAND(GUICtrlRead($radio1), $GUI_CHECKED) = $GUI_CHECKED And BitAND(GUICtrlRead($box1), $GUI_CHECKED) = $GUI_CHECKED Then
		$bcheck = 1 ;Blockliste überwachen  (an)
		$count = 0
		_BlockListCheck() ; die Blockliste, falls vorhanden überprüfen
	Else
		$bcheck = 0 ;Blockliste überwachen  (aus)
		$count = 0
	EndIf
EndFunc   ;==>_Checkbox

Func _Checkradio2()
	If BitAND(GUICtrlRead($radio2), $GUI_CHECKED) = $GUI_CHECKED And BitAND(GUICtrlRead($radio1), $GUI_UNCHECKED) = $GUI_UNCHECKED And BitAND(GUICtrlRead($box1), $GUI_CHECKED) = $GUI_CHECKED Then
		GUICtrlSetState($box1, $GUI_UNCHECKED)
		GUICtrlSetState($radio1, $GUI_UNCHECKED)
		GUICtrlSetState($radio2, $GUI_CHECKED)
		$bcheck = 0 ;Blockliste überwachen  (aus)
	EndIf
EndFunc   ;==>_Checkradio2

Func _Check_Box()
	$number = 0
	For $i = 0 To UBound($daten) - 1
		If _GUICtrlListView_GetItemChecked($idListView, $i) And $sel[$i] = 0 Then
			_GUICtrlListView_SetItemState($idListView, $i, $LVIS_DROPHILITED, $LVIS_DROPHILITED)
			_GUICtrlListView_SetItemSelected($idListView, $i, True, True)
			$sel[$i] = 1
			$number += 1
		ElseIf Not _GUICtrlListView_GetItemChecked($idListView, $i) And $sel[$i] = 1 Then
			_GUICtrlListView_SetItemDropHilited($idListView, $i, False)
			_GUICtrlListView_SetItemSelected($idListView, $i, False, False)
			$sel[$i] = 0
			$number -= 1
		ElseIf _GUICtrlListView_GetItemChecked($idListView, $i) And $sel[$i] = 1 Then
			$number += 1
		EndIf
	Next
	If BitAND(GUICtrlRead($box1), $GUI_CHECKED) = $GUI_CHECKED Then
		If $oldnumber <> $number Then ; neue Prozesse in Blockliste eintragen
			$oldnumber = $number
			_BlockListe()
			_BlockListCheck() ; die Blockliste überprüfen
		EndIf
	EndIf
EndFunc   ;==>_Check_Box

Func _Edit_Blocklist()
	ToolTip('') ; kein ToolTip mehr
	Local $file, $line, $ok = 0
	If Not FileExists($blocklist) Then
		If Not _Confirm(' Keine Blockliste gefunden! Wollen Sie eine erstellen ?') Then Return
		$neu = 1
		_NewBlockList()
	Else
		If FileExists($blocklist) Then
			$file = FileOpen($blocklist, $FO_READ) ; Lesemodus
			If $file <> -1 Then
				$line = FileReadLine($file)
				If $line = "[Blocklist]" Then $ok = 1
				FileClose($file)
			EndIf
		EndIf
		If $ok = 1 Then
			If Not ProcessExists("notepad.exe") Then
				Run(@ComSpec & " /c start notepad.exe " & $blocklist, "", @SW_HIDE) ; Blockliste in Editor laden
			EndIf
			Local $hWnd = WinWait($sTitle & '_blocklist.ini', "[Blocklist]", 1)
			If BitAND(WinGetState($hWnd), 1) Then ; wenn es existiert...
				If BitAND(WinGetState($hWnd), 16) Then ; wenn minimiert
					WinActivate($hWnd) ; in den Vordergrund holen...
				EndIf
				If Not BitAND(WinGetState($hWnd), 8) Then ; wenn nicht aktiv
					WinActivate($hWnd) ; in den Vordergrund holen...
				EndIf
			Else
				Run(@ComSpec & " /c start notepad.exe " & $blocklist, "", @SW_HIDE) ; Blockliste in Editor laden
			EndIf
		Else
			If Not _Confirm(' Die Blockliste ist kaputt! Soll sie neu erstellt werden ?') Then Return
			$neu = 1
			_NewBlockList()
		EndIf
	EndIf
EndFunc   ;==>_Edit_Blocklist

Func _NewBlockList()
	ToolTip('') ; kein ToolTip mehr
	Local $file
	If $neu = 0 Then ; wenn vorher damit Einverstanden, dann diese IF-Then Schleife ignorieren...
		If Not FileExists($blocklist) Then
			If Not _Confirm('        Soll eine neue Blockliste erzeugt werden ?') Then
				If BitAND(GUICtrlRead($box1), $GUI_CHECKED) = $GUI_CHECKED Then GUICtrlSetState($box1, $GUI_UNCHECKED) ; wenn keine Blockliste, nicht mehr Anhaken...
				Return
			EndIf
		Else
			If Not _Confirm('Soll die alte Blockliste wirklick überschrieben werden ?') Then Return
		EndIf
	EndIf
	$neu = 0 ; damit die IF-Then Schleife durchlaufen wird, wenn erneut die Funktion aufgerufen wird
	$file = FileOpen($blocklist, $FO_OVERWRITE) ; Schreibmodus (löschen des vorherigen Inhaltes)
	If $file <> -1 Then
		FileWriteLine($file, "[Blocklist]")
		FileClose($file)
		_GUICtrlStatusBar_SetIcon($hStatus, 0, $ahIcons[1]) ; Icon fuer die linke Seite der Statuszeile setzen
		_GUICtrlStatusBar_SetText($hStatus, 'Ok, neue Blockliste wurde erstellt...', 0) ; Hinweis in der Statuszeile
		Sleep(2000)
		_GUICtrlStatusBar_SetText($hStatus, 'Bereit.', 0) ; die linke Statuszeile aktualisieren
		_GUICtrlStatusBar_SetIcon($hStatus, 0, $ahIcons[0]) ; das Icon setzen
	Else
		_GUICtrlStatusBar_SetIcon($hStatus, 0, $ahIcons[2]) ; Icon fuer die linke Seite der Statuszeile setzen
		GUISetCursor(15, $GUI_CURSOR_OVERRIDE, $hGUI) ; und den Mauscursor als rotierenden Zeiger anzeigen
		_GUICtrlStatusBar_SetText($hStatus, 'Fehler, neue Blockliste konnte nicht erstellt werden!', 0) ; Hinweis in der Statuszeile
		Sleep(2000)
		GUISetCursor(2, $GUI_CURSOR_OVERRIDE, $hGUI) ; den Mauszeiger wieder zuruecksetzen
		_GUICtrlStatusBar_SetText($hStatus, 'Bereit.', 0) ; die linke Statuszeile aktualisieren
		_GUICtrlStatusBar_SetIcon($hStatus, 0, $ahIcons[0]) ; das Icon setzen
	EndIf
EndFunc   ;==>_NewBlockList

Func _BlockListe() ; hier werden neue Prozessnamen in die Blockliste eingetragen...
	Local $file, $blockname, $neu, $line, $ok = 0
	If FileExists($blocklist) Then
		$file = FileOpen($blocklist, $FO_READ) ; Lesemodus
		If $file <> -1 Then
			$line = FileReadLine($file)
			If $line = "[Blocklist]" Then
				$line = FileReadLine($file)
				If @error = -1 Then
					$neu = 1
				Else
					$neu = 0
				EndIf
			EndIf
			FileClose($file)
			If $neu = 1 Then
				$file = FileOpen($blocklist, $FO_OVERWRITE) ; Schreibmodus (löschen des vorherigen Inhaltes)
				If $file <> -1 Then
					FileWriteLine($file, "[Blocklist]")
				EndIf
			Else
				$file = FileOpen($blocklist, $FO_APPEND) ; Schreibmodus (anhängend an das Dateiende)
				_old_blocklist()
			EndIf
			If $file <> -1 Then
				For $i = 0 To UBound($sel) - 1
					If $sel[$i] = 1 Then
						$blockname = _GUICtrlListView_GetItemText($hListView, $i) ; Processname
						For $s = 1 To UBound($olddata) - 1
							If $blockname = $olddata[$s] Then ; wenn der Prozessname in der Blockliste schon eintragen ist
								$ok = 1 ; dann nicht nochmal in die Liste schreiben
								ExitLoop
							Else
								$ok = 0
							EndIf
						Next
						If $ok = 0 Then
							FileWriteLine($file, $blockname) ; Prozessname in die Liste eintragen
							$ok = 1
						EndIf
					EndIf
				Next
				FileClose($file)
			EndIf
		EndIf
	EndIf
EndFunc   ;==>_BlockListe

Func _old_blocklist() ; hier wird der Inhalt der Blockliste in ein Array geschrieben
	If Not FileExists($blocklist) Then Return ; wenn die Datei nicht existiert, dann die Funktion verlassen
	Local $aCol
	Local $file = FileOpen($blocklist, $FO_READ) ; Lesemodus
	If $file = -1 Then Return ; Fehler
	Local $ifile = FileRead($file) ; die Datei komplett laden
	FileClose($file)
	If StringRight($ifile, 2) = @CRLF Then $ifile = StringTrimRight($ifile, 2) ; ein evtl. vorhandenes @CRLF am Ende entfernen
	If $ifile = '' Then Return ; Funktion verlassen, Dateiinhalt war leer
	Local $newdata = StringSplit($ifile, @CRLF, $STR_ENTIRESPLIT + $STR_NOCOUNT) ; die Datei am Zeilenende splitten
	Local $zCount = UBound($newdata) ; die Anzahl der Zeilen ermitteln
	If UBound($olddata) < $zCount + 1 Then
		ReDim $olddata[UBound($olddata) + $zCount + 1] ; das olddata-Array entsprechend anpassen
	EndIf
	For $i = 1 To $zCount - 1
		$aCol = _ArrayToString($newdata, "", $i, $i)
		$olddata[$i - 1] = $aCol
	Next
EndFunc   ;==>_old_blocklist

Func _BlockListCheck() ; entferne doppelte oder leere Zeilen in den Blockliste und schreibe sie neu...
	If Not FileExists($blocklist) Then Return ; wenn die Datei nicht existiert, dann die Funktion verlassen
	Local $hFile = FileOpen($blocklist, $FO_READ) ; die Blocklistedatei zum lesen oeffnen
	If $hFile = -1 Then Return ; wenn dabei ein Fehler aufgetreten ist, dann die Funktion verlassen
	Local $sFile = FileRead($hFile) ; die Datei komplett in den Hauptspeicher laden
	FileClose($hFile) ; und die geoeffnete Datei wieder schliessen
	If StringRight($sFile, 2) = @CRLF Then $sFile = StringTrimRight($sFile, 2) ; ein evtl. vorhandenes @CRLF am Ende entfernen
	If $sFile = '' Then Return ; wenn die Datei leer ist, dann die Funktion verlassen
	If UBound($olddata) > 0 Then
		For $i = UBound($olddata) - 1 To 0 Step -1
			_ArrayDelete($olddata, $i) ; alte Daten löschen
		Next
		_ArrayAdd($olddata, "[Blocklist]", 1)
	EndIf
	Local $newdata = StringSplit($sFile, @CR, $STR_ENTIRESPLIT + $STR_NOCOUNT) ; die Datei am Zeilenende splitten
	$newdata = _ArrayUnique($newdata) ; doppelte Daten entfernen
	Local $zCount = UBound($newdata) ; die Anzahl der Zeilen ermitteln
	Local $xx = 0, $data, $line
	Do
		$line = _ArrayToString($newdata, "", $xx, $xx)
		If StringLen($line) > 0 Then
			If StringRight($line, 4) = '.exe' Then
				_ArrayAdd($olddata, $line)
			EndIf
		EndIf
		$xx += 1
	Until $xx = $zCount
	If StringRight($olddata, 2) = @CRLF Then $olddata = StringTrimRight($olddata, 2) ; ein evtl. vorhandenes @CRLF am Ende entfernen
	$hFile = FileOpen($blocklist, $FO_OVERWRITE) ; Überschreibe die alte Blockliste
	If $hFile <> -1 Then ; wenn kein Fehler, dann...
		For $i = 0 To UBound($olddata) - 1
			$data = $olddata[$i] & @CR ; schreibe neue Zeile
			FileWrite($hFile, $data) ; die Olddata-Array komplett schreiben
		Next
		FileWriteLine($blocklist, @CRLF)
	EndIf
	FileClose($hFile)
EndFunc   ;==>_BlockListCheck

Func _service_process_name($name, $P_PID) ; Processname , ProgramPID
	Local $mm, $servicePID
	$service_exit = 0
	For $yy = 1 To $aServicesInfo[0][0]
		$servicePID = $aServicesInfo[$yy][11]
		If $servicePID > 0 Then
			If $P_PID = $servicePID Then
				$service_exit = 1
				$servicekill = StringLower($aServicesInfo[$yy][0])
				ExitLoop
			EndIf
		EndIf
	Next
EndFunc   ;==>_service_process_name

Func _add_task()
	ToolTip('') ; kein ToolTip mehr
	Local $a, $sPath, $newfile, $nxt, $PID, $sDefaultDir = @ProgramFilesDir
	If $newfile <> '' Then $sDefaultDir = StringRegExpReplace($newfile, '(.+\\).+', '$1')
	GUISetState(@SW_DISABLE, $hGUI)
	$sPath = FileOpenDialog('Neuen Prozess auswählen', $sDefaultDir, 'Programm (*.exe)', 3, '', $hGUI)
	GUISetState(@SW_ENABLE, $hGUI)
	If $sPath = '' Then
		$newfile = ''
	Else
		$nxt = 0
		$newfile = $sPath
		$newfile = StringRegExpReplace($newfile, '.+\\(.*)', '$1')
		For $j = 0 To UBound($forbidden_process) - 1
			If $newfile = 'explorer.exe' Then ExitLoop ; Explorer ist erlaubt!
			If $newfile = $forbidden_process[$j] Then
				$nxt = 1
				ExitLoop
			Else
				$nxt = 0
			EndIf
		Next
		If $nxt = 1 Then ; wenn ausgefilterter Prozess gefunden
			MsgBox($MB_ICONINFORMATION, "Fehler", "Diese Datei ist nicht erlaubt!", 0, $hGUI)
			$nxt = 0
		Else
			$PID = Run($sPath)
			ProcessWait($newfile, 10)
			WinActivate($sTitle, '')
			If $PID Then
				ReDim $daten[UBound($daten) + 1] ; Verändert die Größe des bestehenden Array
				ReDim $sel[UBound($sel) + 1] ; Verändert die Größe des bestehenden Array
				$a = UBound($daten) - 1
				$daten[$a] = GUICtrlCreateListViewItem($newfile, $idListView)
				_Taskscan()
			EndIf
		EndIf
	EndIf
EndFunc   ;==>_add_task

Func _Save_Processlist() ; nur was momentan die ListView anzeigt wird abgespeichert...
	Local $file, $Save_File, $aItem, $len, $iPosition, $iPosition1, $iPosition2, $iPosition3, $ee, $found = 0
	Local $space, $space2, $space3, $PID, $Description, $Benutzer, $p_pfad, $hi_len1, $hi_len2, $hi_len3, $header
	ToolTip('') ; kein ToolTip mehr
	ToolTip('') ; kein ToolTip mehr
	$Save_File = FileSaveDialog("Speichere Prozessliste", $pfad, "Textdateien (*.txt)", 16, 'Prozessliste.txt', $hGUI)
	If @error Then
		_GUICtrlStatusBar_SetIcon($hStatus, 0, $ahIcons[2]) ; Icon fuer die linke Seite der Statuszeile setzen
		_GUICtrlStatusBar_SetText($hStatus, 'Ok, speichern abgebrochen...', 0) ; Hinweis in der Statuszeile
		Sleep(2000)
		_GUICtrlStatusBar_SetText($hStatus, 'Bereit.', 0) ; die linke Statuszeile aktualisieren
		_GUICtrlStatusBar_SetIcon($hStatus, 0, $ahIcons[0]) ; das Icon setzen
		Return
	EndIf
	$file = FileOpen($Save_File, $FO_OVERWRITE) ; Schreibmodus (löschen des vorherigen Inhaltes)
	If $file <> -1 Then
		_GUICtrlStatusBar_SetIcon($hStatus, 0, $ahIcons[1]) ; Icon fuer die linke Seite der Statuszeile setzen
		_GUICtrlStatusBar_SetText($hStatus, 'Ok, einen Momentane, bitte...', 0) ; Hinweis in der Statuszeile
		FileWriteLine($file, $sTitle & $sVersion & @CRLF)
		FileWriteLine($file, $systeminfo & " " & @OSServicePack & @CRLF)
		FileWriteLine($file, @MDAY & "." & @MON & "." & @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & @CRLF)
		FileWriteLine($file, @CRLF)
		; String_Analyse
		For $i = 0 To UBound($sel) - 2
			$aItem = _GUICtrlListView_GetItemText($idListView, $i) ; Processname
			$len = StringLen($aItem)
			If $hi_len1 < $len Then $hi_len1 = $len
			$Description = _GUICtrlListView_GetItemText($idListView, $i, 2) ; Beschreibung
			$len = StringLen($Description)
			If $hi_len2 < $len Then $hi_len2 = $len
			$PID = _GUICtrlListView_GetItemText($idListView, $i, 1) ;PID von der ListView holen
			$len = StringLen(_GetProcessOwner($PID))
			If $hi_len3 < $len Then $hi_len3 = $len
		Next
		For $i = 0 To $hi_len1 - 8
			$space = $space & Chr(32) ; Abstand 1
		Next
		For $i = 0 To $hi_len2 - 14
			$space2 = $space2 & Chr(32) ; Abstand 2
		Next
		For $i = 0 To $hi_len3 - 6
			$space3 = $space3 & Chr(32) ; Abstand 3
		Next
		$header = "Prozessname" & $space & "PID" & Chr(32) & Chr(32) & Chr(32) & Chr(32) & "Beschreibung" & $space2 & "Benutzer" & $space3 & "Pfad" & @CRLF
		$iPosition = StringInStr($header, "PID") - 1
		$iPosition1 = StringInStr($header, "Beschreibung") - 1
		$iPosition2 = StringInStr($header, "Benutzer") - 1
		$iPosition3 = StringInStr($header, "Pfad") - 1
		FileWriteLine($file, $header & @CRLF)
		For $i = 0 To UBound($daten) - 2
			$aItem = _GUICtrlListView_GetItemText($idListView, $i) ; Processname von der ListView holen
			$PID = _GUICtrlListView_GetItemText($idListView, $i, 1) ;PID von der ListView holen
			$Description = _GetProcessDescription($PID) ; Beschreibung vom Prozess holen
			$Benutzer = _GetProcessOwner($PID) ; User Name vom Prozess
			If IsNumber($Benutzer) Then $Benutzer = 'NT-AUTORITÄT\SYSTEM' ; wenn der Benutzer als Nummer angezeigt wird...
			$p_pfad = _GetProcessPath($PID) ; pfad

			For $xx = 0 To UBound($extra_names) - 1
				If $aItem = $extra_names[$xx] Then ; Prozessname = Extraname ?
					$Description = $eDescription[$xx]
					$p_pfad = $extrapfad & $aItem ; extrapfad zum namen hinzufügen
					If $aItem = 'mofcomp.exe' Then $p_pfad = $extrapfad & '\wbem\' & $aItem ; noch ein extrapfad
					If $aItem = 'iexplore.exe' Then $p_pfad = @HomeDrive & '\Program Files\Internet Explorer\' & $aItem
					ExitLoop
				EndIf
			Next

			If StringLen($aItem) < $iPosition Then
				Do
					$aItem = $aItem & Chr(32)
				Until StringLen($aItem) = $iPosition ; Abstand 1 hinzufügen
			EndIf
			$aItem = $aItem & $PID
			If StringLen($aItem) < $iPosition1 Then
				Do
					$aItem = $aItem & Chr(32)
				Until StringLen($aItem) = $iPosition1 ; Abstand 2 hinzufügen
			EndIf
			If StringLen($Description) > 60 Then $Description = StringLeft($Description, 60) ; 60 Zeichen Beschreibung sollten wohl reichen ...
			$aItem = $aItem & $Description
			If StringLen($aItem) < $iPosition2 Then
				Do
					$aItem = $aItem & Chr(32)
				Until StringLen($aItem) = $iPosition2 ; Abstand 3 hinzufügen
			EndIf
			$aItem = $aItem & $Benutzer
			If StringLen($aItem) < $iPosition3 Then
				Do
					$aItem = $aItem & Chr(32)
				Until StringLen($aItem) = $iPosition3 ; Abstand 4 hinzufügen
			EndIf
			$aItem = $aItem & $p_pfad
			FileWriteLine($file, $aItem & @CRLF) ; formatierte Zeile schreiben...
		Next
		FileClose($file)
		Sleep(2000)
		_GUICtrlStatusBar_SetIcon($hStatus, 0, $ahIcons[0]) ; Icon fuer die linke Seite der Statuszeile setzen
		_GUICtrlStatusBar_SetText($hStatus, 'Die Prozessliste wurde erfolgreich abgespeichert...', 0) ; Hinweis in der Statuszeile
		Sleep(2000)
		_GUICtrlStatusBar_SetText($hStatus, 'Bereit.', 0) ; die linke Statuszeile aktualisieren
	EndIf
EndFunc   ;==>_Save_Processlist

Func _Aufloesungen()
	ToolTip('') ; kein ToolTip
	_SysRoutines_Off()
	$winInfo = 1 ; maker für dieses Fenster
	GUISetState(@SW_DISABLE, $hGUI) ; das Hauptfenster deaktivieren
	Local $iOldEventMode = Opt('GUIOnEventMode', 0) ; auf den MessageLoop-Modus umschalten (vorherigen Status merken)
	Local $aWinPos = WinGetPos($hGUI) ; die Position des Hauptfensters holen
	Local $x = $aWinPos[0] + $aWinPos[2] / 2 - 145 ; horizontal auf den Koordinaten des Hauptfenster zentrieren
	Local $y = $aWinPos[1] + $aWinPos[3] / 2 - 105 ; vertikal auf den Koordinaten des Hauptfenster zentrieren
	$hInfoGui = GUICreate(StringFormat('%s - Auflösungen', $sTitle), 280, 150, $x, $y, BitOR($WS_CAPTION, $WS_POPUPWINDOW), Default, $hGUI) ; das Infofenster erstellen
	GUISetBkColor(0x08768E, $hInfoGui) ; die Hintergrundfarbe fuer das Infofenster setzen
	GUISetIcon('shell32.dll', -222, $hInfoGui) ; Fenstericon setzen
	GUISetFont(9.5, 400, 0, 'Verdana', $hInfoGui, 5) ; den Standard-Zeichensatz fuer das Infofenster setzen
	GUICtrlCreateGroup('', 5, 5, 270, 108) ; eine Gruppe erstellen
	GUICtrlCreateLabel("Bitte eine Auflösung auswählen...", 25, 22, 212, 30) ; noch ein Textfeld erstellen
	GUICtrlSetColor(-1, 0xEEEEEE) ; die Textfarbe setzen
	Local $sComboRead, $oldAufs = $iWidth & 'x' & $iHeight
	Local $idComboBox = GUICtrlCreateCombo("800x600", 25, 44, 200, 20)
	Local $label2 = GUICtrlCreateLabel("Auflösung momentan: " & $oldAufs, 25, 80, 225, 30) ; noch ein Textfeld erstellen
	GUICtrlSetColor(-1, 0xFCE329) ; die Textfarbe setzen
	GUICtrlSetData($idComboBox, "1024x768|1152x864|1280x720")
	Local $idYes = GUICtrlCreateButton('Ok', 60, 120, 70, 24) ; den "Ja"-Button erstellen
	Local $idNo = GUICtrlCreateButton('Abbruch', 145, 120, 70, 24, $BS_DEFPUSHBUTTON) ; den "Abbruch"-Button erstellen
	GUICtrlCreateGroup('', -99, -99, 1, 1) ; die Gruppe beenden

	GUISetState(@SW_SHOW, $hInfoGui) ; das Infofenster anzeigen
	While True ; eine Endlosschleife
		Switch GUIGetMsg() ; hier wird der MessageLoop-Modus abgefragt
			Case $idOk, $GUI_EVENT_CLOSE ; wenn das Infofenster geschlossen wird, dann...
				ExitLoop ; die Endlosschleife verlassen
			Case $idComboBox
				$sComboRead = GUICtrlRead($idComboBox)
				GUICtrlSetData($label2, "ausgewählte Auflösung : " & $sComboRead)
			Case $idNo ; wenn Abbruch geklickt wurde, dann...
				ExitLoop ; die Endlosschleife verlassen
			Case $idYes ; wenn auf "Ok" geklickt wurde, dann...
				$sComboRead = GUICtrlRead($idComboBox)
				$iWidthMin = StringMid($sComboRead, 1, StringInStr($sComboRead, "x") - 1) ; neue Breite für das Hauptfenster
				$iHeightMin = StringMid($sComboRead, StringInStr($sComboRead, "x") + 1, StringLen($sComboRead)) ; neue Hoehe für das Hauptfenster
				$iWidth = $iWidthMin
				$iHeight = $iHeightMin
				WinMove($hGUI, '', $iLeft, $iTop, $iWidth, $iHeight) ; das Hauptfenster an die gespeicherten Daten anpassen
				_GUICtrlListView_SetColumnWidth($hListView, 2, $LVSCW_AUTOSIZE_USEHEADER) ; ListView-Spaltenbreite setzen
				_Control_Change() ; einige Controls neu Positionieren
				ExitLoop
		EndSwitch
	WEnd
	GUISetState(@SW_ENABLE, $hGUI) ; das Hauptfenster wieder aktivieren
	GUIDelete($hInfoGui) ; das Infofenster loeschen
	$winInfo = 0
	Opt('GUIOnEventMode', $iOldEventMode) ; und den alten EventModus wiederherstellen
	_SysRoutines_On()
EndFunc   ;==>_Aufloesungen

Func _mein_about()
	ToolTip('') ; kein ToolTip mehr
	_SysRoutines_Off()
	$winInfo = 1 ; maker für dieses Fenster
	GUISetState(@SW_DISABLE, $hGUI) ; das Hauptfenster deaktivieren
	Local $iOldEventMode = Opt('GUIOnEventMode', 0) ; auf den MessageLoop-Modus umschalten (vorherigen Status merken)
	Local $aWinPos = WinGetPos($hGUI) ; die Position des Hauptfensters holen
	Local $x = $aWinPos[0] + $aWinPos[2] / 2 - 225 ; horizontal auf den Koordinaten des Hauptfenster zentrieren
	Local $y = $aWinPos[1] + $aWinPos[3] / 2 - 115 ; vertikal auf den Koordinaten des Hauptfenster zentrieren
	$hInfoGui = GUICreate(StringFormat('%s - Info', $sTitle), 480, 200, $x, $y, BitOR($WS_CAPTION, $WS_POPUPWINDOW), Default, $hGUI) ; das Infofenster erstellen
	Local $logo = GUICtrlCreatePic($BMP, 328, 30, 127, 40, $SS_BITMAP)
	GUICtrlSetState($logo, $GUI_HIDE) ; Logo noch nicht anzeigen
	GUISetBkColor(0x08768E, $hInfoGui) ; die Hintergrundfarbe fuer das Infofenster setzen
	GUISetIcon('shell32.dll', -222, $hInfoGui) ; Fenstericon setzen
	GUISetFont(9.5, 400, 0, 'Verdana', $hInfoGui, 5) ; den Standard-Zeichensatz fuer das Infofenster setzen
	Local $sMsg = StringFormat('Version: %s\nDatum:  %s\nAutor:    %s', $sVersion, $sDate, $sAuthor)
	GUICtrlCreateGroup('', 5, 2, 470, 155) ; eine Gruppe erstellen
	GUICtrlCreateLabel($sMsg, 25, 25, 300, 70) ; ein Textfeld erstellen
	GUICtrlCreateLabel("Dieses Programm ist Freeware und", 25, 78, 235, 30) ; noch ein Textfeld erstellen
	GUICtrlCreateLabel("---> immer mit Vorsicht benutzen...!", 65, 94, 340, 30) ; noch ein Textfeld erstellen
	GUICtrlSetColor(-1, 0xFFE3AE) ; die Textfarbe setzen
	GUICtrlCreateLabel('für QuellCode siehe auf: ', 25, 120, 160, 30) ; noch ein Textfeld erstellen
	GUICtrlCreateIcon('shell32.dll', -15, 310, 115, 32, 32) ; das Homepage-Icon erstellen
	Local $idLink = GUICtrlCreateLabel('www.AutoIt.de', 185, 120, 90, 18) ; ein Textfeld als Link erstellen
	GUICtrlSetFont(-1, 9.5, 400, 6, 'Verdana') ; Zeichensatz fuer das Textfeld setzen (hier zusaetzlich unterstrichen)
	GUICtrlSetColor(-1, 0xFFFFFF) ; die Textfarbe setzen
	GUICtrlSetCursor(-1, 0) ; und den Mauscursor beim "ueberfahren" auf das Handsymbol setzen

	GUICtrlCreateGroup('', -99, -99, 1, 1) ; die Gruppe beenden
	Local $idOk = GUICtrlCreateButton('Ok', 200, 165, 80, 28) ; einen "Ok"-Button erstellen
	GUISetState(@SW_SHOW, $hInfoGui) ; das Infofenster anzeigen
	GUICtrlSetState($logo, $GUI_SHOW) ; Logo noch jetzt anzeigen
	While True ; eine Endlosschleife
		Switch GUIGetMsg() ; hier wird der MessageLoop-Modus abgefragt
			Case $idOk, $GUI_EVENT_CLOSE ; wenn das Infofenster geschlossen wird, dann...
				ExitLoop ; die Endlosschleife verlassen
			Case $idLink ; wenn der Link angeklickt wird, dann...
				_gowebsite() ; URL aufrufen
		EndSwitch
	WEnd
	GUISetState(@SW_ENABLE, $hGUI) ; das Hauptfenster wieder aktivieren
	GUIDelete($hInfoGui) ; das Infofenster loeschen
	$winInfo = 0
	Opt('GUIOnEventMode', $iOldEventMode) ; und den alten EventModus wiederherstellen
	_SysRoutines_On()
EndFunc   ;==>_mein_about

Func _Confirm($sMsg) ; Diese Funktion fragt den Anwender, ob er eine bestimmte Aktion wirklich durchfuehren will
	ToolTip('') ; kein ToolTip mehr
	; überschreiben der alten Block-Liste ?
	; Funktion von Oscar (Danke), verändert von TV_Freeze...
	Local $iOldEventMode = Opt('GUIOnEventMode', 0) ; auf den MessageLoop-Modus umschalten (vorherigen Status merken)
	Local $aWinPos = WinGetPos($hGUI) ; die Position des Hauptfensters holen
	Local $x = $aWinPos[0] + $aWinPos[2] / 2 - 200 ; horizontal auf den Koordinaten des Hauptfenster zentrieren
	Local $y = $aWinPos[1] + $aWinPos[3] / 2 - 60 ; vertikal auf den Koordinaten des Hauptfenster zentrieren
	Local $hConfirmGui = GUICreate(StringFormat('%s - Nachfrage', $sTitle), 370, 90, $x, $y, BitOR($WS_CAPTION, $WS_POPUPWINDOW), Default, $hGUI) ; das Nachfragefenster erstellen
	GUISetBkColor(0x08768E, $hConfirmGui) ; die Hintergrundfarbe fuer das Nachfragefenster setzen
	GUISetIcon('shell32.dll', -24, $hConfirmGui) ; Fenstericon setzen
	GUISetFont(9.0, 400, 0, 'Verdana', $hConfirmGui, 5) ; den Standard-Zeichensatz fuer das Nachfragefenster setzen
	GUICtrlCreateGroup('', 2, 1, 365, 45) ; Gruppe erstellen
	GUICtrlCreateLabel(StringFormat($sMsg), 10, 20, 350, 20) ; ein Textfeld erstellen
	GUICtrlSetColor(-1, 0xFFE3AE) ; die Textfarbe setzen
	GUICtrlCreateGroup('', -99, -99, 0, 0) ; die Gruppe schliessen
	Local $idYes = GUICtrlCreateButton('Ja', 240, 56, 60, 25) ; den "Ja"-Button erstellen
	Local $idNo = GUICtrlCreateButton('Nein', 305, 56, 60, 25, $BS_DEFPUSHBUTTON) ; den "Nein"-Button erstellen
	GUISetState(@SW_DISABLE, $hGUI) ; das Hauptfenster deaktivieren
	GUISetState(@SW_SHOW, $hConfirmGui) ; das Nachfragefenster anzeigen
	Local $fReturn = False ; die Standard-Rueckgabe (False), wenn "Nein" angeklickt oder das Fenster geschlossen wird
	While True ; eine Endlosschleife
		Switch GUIGetMsg() ; hier wird der MessageLoop-Modus abgefragt
			Case $idNo, $GUI_EVENT_CLOSE ; wenn das Nachfragefenster geschlossen wird, dann...
				ExitLoop ; die Endlosschleife verlassen
			Case $idYes ; wenn auf "Ja" geklickt wurde, dann...
				$fReturn = True ; den Rueckgabewert auf True setzen
				ExitLoop ; und die Endlosschleife verlassen
		EndSwitch
	WEnd
	GUISetState(@SW_ENABLE, $hGUI) ; das Hauptfenster wieder aktivieren
	GUIDelete($hConfirmGui) ; das Nachfragefenster loeschen
	Opt('GUIOnEventMode', $iOldEventMode) ; und den alten EventModus wiederherstellen
	Return $fReturn
EndFunc   ;==>_Confirm

Func _message_times() ; verschiedene Zeiten in ein Array packen
	$tmp = "5 "
	If $backupZ < 361 Then
		For $i = 10 To 3590 Step 10 ; all 10 seconds a message
			$tmp = $tmp & $i & " "
		Next
	ElseIf $backupZ > 360 And $backupZ < 1201 Then
		For $i = 30 To 3570 Step 30 ; all 30 seconds a message
			$tmp = $tmp & $i & " "
		Next
	ElseIf $backupZ > 1200 And $backupZ < 3600 Then
		For $i = 60 To 3540 Step 60 ; all 60 seconds a message
			$tmp = $tmp & $i & " "
		Next
	ElseIf $backupZ > 3600 Then
		For $i = 60 To 31536000 Step 3600 ; all 1 std a message
			$tmp = $tmp & $i & " "
		Next
	EndIf
	$tmp = StringSplit($tmp, " ")
EndFunc   ;==>_message_times

Func _Input()
	Local $aContrPos, $aMousePos
	$newinput = GUICtrlRead($input)
	If $unlocker = 0 Then
		If $newinput > 3600 Then
			_GUICtrlStatusBar_SetIcon($hStatus, 0, $ahIcons[1]) ; Icon fuer die linke Seite der Statuszeile setzen
			_GUICtrlStatusBar_SetText($hStatus, 'Diese neue Eingabe ist nicht erlaubt!', 0) ; Hinweis in der Statuszeile
			Sleep(2000)
			_GUICtrlStatusBar_SetText($hStatus, 'Bereit.', 0) ; die linke Statuszeile aktualisieren
			_GUICtrlStatusBar_SetIcon($hStatus, 0, $ahIcons[0]) ; das Icon setzen
			GUICtrlSetData($input, $oldinput)
		ElseIf $newinput < 1 Then
			_GUICtrlStatusBar_SetIcon($hStatus, 0, $ahIcons[1]) ; Icon fuer die linke Seite der Statuszeile setzen
			_GUICtrlStatusBar_SetText($hStatus, 'Neue Eingabe liegt unter 1 Sekunde!', 0) ; Hinweis in der Statuszeile
			Sleep(2000)
			_GUICtrlStatusBar_SetText($hStatus, 'Bereit.', 0) ; die linke Statuszeile aktualisieren
			_GUICtrlStatusBar_SetIcon($hStatus, 0, $ahIcons[0]) ; das Icon setzen
			GUICtrlSetData($input, $oldinput)
		EndIf
	EndIf
	If $unlocker = 1 Then
		$newinput = GUICtrlRead($input)
		If $newinput > 31536000 Then ; over one Year ?
			_GUICtrlStatusBar_SetIcon($hStatus, 0, $ahIcons[1]) ; Icon fuer die linke Seite der Statuszeile setzen
			_GUICtrlStatusBar_SetText($hStatus, 'Neue Eingabe beträgt über ein Jahr!', 0) ; Hinweis in der Statuszeile
			Sleep(2000)
			_GUICtrlStatusBar_SetText($hStatus, 'Bereit.', 0) ; die linke Statuszeile aktualisieren
			_GUICtrlStatusBar_SetIcon($hStatus, 0, $ahIcons[0]) ; das Icon setzen
			GUICtrlSetData($input, $oldinput)
		ElseIf $newinput < 1 Then
			_GUICtrlStatusBar_SetIcon($hStatus, 0, $ahIcons[1]) ; Icon fuer die linke Seite der Statuszeile setzen
			_GUICtrlStatusBar_SetText($hStatus, 'Neue Eingabe liegt unter 1 Sekunde!', 0) ; Hinweis in der Statuszeile
			Sleep(2000)
			_GUICtrlStatusBar_SetText($hStatus, 'Bereit.', 0) ; die linke Statuszeile aktualisieren
			_GUICtrlStatusBar_SetIcon($hStatus, 0, $ahIcons[0]) ; das Icon setzen
			GUICtrlSetData($input, $oldinput)
		EndIf
	EndIf
	$backupZ = $newinput
	_message_times()
EndFunc   ;==>_Input

Func _Unlock()
	ToolTip('') ; kein ToolTip mehr
	Local $passwd, $aWinPos
	$oldinput = GUICtrlRead($input)
	GUICtrlSetOnEvent($input, '')
	_SysRoutines_Off()
	$aWinPos = WinGetPos($hGUI)

	$passwd = InputBox("Erweitere Beenden über Zeit", "Wo kann man den Quellcode herunterladen ?", "", "", 260, 130, $aWinPos[0] + $aWinPos[2] / 2 - 120, $aWinPos[1] + 220, 0, $hGUI)
	If $passwd <> "" Then
		If $passwd = "www.AutoIt.de" Then ; sehr einfach !
			MsgBox(0, "Erweiterung Ok!", "Das Beenden nach Zeit wurde aufgebort!", 0, $hGUI)
			If $unlocker = 0 Then
				$unlocker = 1
				GUICtrlDelete($input)
				GUICtrlDelete($updown)
				GUICtrlDelete($label)
				$input = GUICtrlCreateInput($oldinput, 440, 42, 84, 20, BitOR($ES_NUMBER, $ES_CENTER))
				$updown = GUICtrlCreateUpdown($input, $UDS_NOTHOUSANDS)
				GUICtrlSetLimit($updown, 31536000, 1)
				GUICtrlSetLimit($input, 8, 1)
				GUICtrlSetState($input, $GUI_FOCUS)
				GUICtrlSetTip($input, 'Eingabe der Sekunden zum Beenden der Prozesse... [1-31536000]', '', -1, 2)
				$label = GUICtrlCreateLabel("Sekunden...", 536, 46)
			EndIf
			GUICtrlSetOnEvent($input, '_Input')
			_Control_Change() ; einige Controls neu Positionieren
			GUICtrlSetResizing($input, $GUI_DOCKSIZE + $GUI_DOCKLEFT + $GUI_DOCKTOP) ; und das Resizising festlegen
			GUICtrlSetResizing($label, $GUI_DOCKLEFT + $GUI_DOCKRIGHT + $GUI_DOCKTOP) ; Resizising neu erstellen
		Else
			MsgBox(0, "Eingabe falsch!", "Die Antwort war nicht Richtig.", 0, $hGUI)
			$tipp = $tipp + 1
			If $tipp = 3 Then ; Tip Anzeigen bei 3 falsche Eingaben
				SplashTextOn($sTitle & $sVersion & " - Tip", "-> Menü Prozess-Killer Info!", 280, 50, -1, -1, $DLG_TEXTLEFT, "Verdana", 14)
				$tipp = 0
				Sleep(4000) ; 4 Sekunden warten
				SplashOff()
			EndIf
			If $unlocker = 1 Then
				$unlocker = 0
				GUICtrlDelete($input)
				GUICtrlDelete($updown)
				GUICtrlDelete($label)
				If $oldinput > 3600 Then $oldinput = 3600
				$input = GUICtrlCreateInput($oldinput, 440, 42, 60, 20, BitOR($ES_NUMBER, $ES_CENTER))
				GUICtrlSetTip(-1, 'Eingabe der Sekunden zum beenden' & @CRLF & 'der Prozesse... [1-3600]')
				GUICtrlSetLimit($input, 4, 1)
				$updown = GUICtrlCreateUpdown($input, $UDS_NOTHOUSANDS)
				GUICtrlSetLimit($updown, 3600, 1)
				$label = GUICtrlCreateLabel("Sekunden...", 510, 46)
			EndIf
			GUICtrlSetOnEvent($input, '_Input')
			_Control_Change() ; einige Controls neu Positionieren
			GUICtrlSetResizing($input, $GUI_DOCKSIZE + $GUI_DOCKLEFT + $GUI_DOCKTOP) ; und das Resizising festlegen
			GUICtrlSetResizing($label, $GUI_DOCKSIZE + $GUI_DOCKLEFT + $GUI_DOCKTOP) ; und das Resizising festlegen
		EndIf
	EndIf
	_SysRoutines_On()
EndFunc   ;==>_Unlock

Func _kurze_Beschreibung()
	ToolTip('') ; kein ToolTip mehr
	Local $sMsg = $sTitle & $sVersion & '\nCopyright (c) 2017  by TV_Freeze\n\n'
	$sMsg &= 'Beschreibung\n'
	If @OSVersion = 'WIN_XP' Then
		$sMsg &= '========\n'
	Else
		$sMsg &= '=========\n'
	EndIf
	$sMsg &= 'Mit dem Prozess-Killer kann man alle nicht geschützten Prozesse\n'
	$sMsg &= 'abschießen und das auf drei verschiedene Arten.\n\n'
	$sMsg &= 'Alle Prozesse die man beenden will einfach\n'
	$sMsg &= 'auf die Spalte mit dem Namen doppelt klicken\n'
	$sMsg &= 'oder ein Hacken vor dem Prozessnamen machen.\n\n'
	$sMsg &= '1. Beende nach Zeit\n'
	$sMsg &= '    Ein Countdown zählt von dem eingegebenden Wert bis Null\n'
	$sMsg &= '    die Sekunden und beendet alle angeharkten Prozesse.\n\n'
	$sMsg &= '2. Beende jetzt\n'
	$sMsg &= '    Alle ausgewählten Prozesse werden nacheinander\n'
	$sMsg &= '    beendet.\n\n'
	$sMsg &= '3. Beende Prozesse in Blockliste\n'
	$sMsg &= '    >>> VORSICHT!\n\n'
	$sMsg &= '    Wenn man hier den Harken gesetzt hat werden die ausgewählten\n'
	$sMsg &= '    Prozessnamen in eine Blockliste geschrieben und beendet.\n'
	$sMsg &= '    Zusätzlich werden alle laufenden Prozesse mit diese Blockliste\n'
	$sMsg &= '    verglichen und wenn der Prozess mit dem in der Liste übereinstimmt\n'
	$sMsg &= '    wird dieser sofort wieder  beendet.\n\n'
	If @OSVersion = 'Win_10' Then
		$sMsg &= '==============================================\n'
	Else
		$sMsg &= '=====================================================\n'
	EndIf
	$sMsg &= 'Dieses Programm ist Freeware. Kann unbegrenzt benutzt werden\n'
	$sMsg &= 'solange man es nicht verändert und alle Dateien vollständig bleiben.'
	_SysRoutines_Off()
	MsgBox(0, 'Kurze Beschreibung ', StringFormat($sMsg), 0, $hGUI)
	_SysRoutines_On()
EndFunc   ;==>_kurze_Beschreibung

Func _gowebsite()
	ShellExecute('https://autoit.de/wcf/') ; ; Coole URL !!!
EndFunc   ;==>_gowebsite

Func _Verknuefnung()
	ToolTip('') ; kein ToolTip mehr
	If @Compiled Then
		If Not FileExists(@DesktopDir & '\' & @ScriptName & '.lnk') Then
			_GUICtrlStatusBar_SetIcon($hStatus, 0, $ahIcons[1]) ; Icon fuer die linke Seite der Statuszeile setzen
			_GUICtrlStatusBar_SetText($hStatus, 'Ok, Erstelle Verknüfung auf dem Desktop...', 0) ; Hinweis in der Statuszeile
			FileCreateShortcut(@ScriptFullPath, @DesktopDir & '\' & @ScriptName) ; Verknüpfung auf Desktop erstellen
		ElseIf FileExists(@DesktopDir & '\' & @ScriptName & '.lnk') Then
			_GUICtrlStatusBar_SetIcon($hStatus, 0, $ahIcons[2]) ; Icon fuer die linke Seite der Statuszeile setzen
			_GUICtrlStatusBar_SetText($hStatus, 'Eine Verknüfung ist schon vorhanden...', 0) ; Hinweis in der Statuszeile
		EndIf
	Else
		If Not FileExists(@DesktopDir & '\' & @ScriptName & '.lnk') Then
			_GUICtrlStatusBar_SetIcon($hStatus, 0, $ahIcons[1]) ; Icon fuer die linke Seite der Statuszeile setzen
			_GUICtrlStatusBar_SetText($hStatus, 'Ok, Erstelle Verknüfung auf dem Desktop...', 0) ; Hinweis in der Statuszeile
			FileCreateShortcut(@ScriptFullPath, @DesktopDir & '\' & @ScriptName) ; Verknüpfung auf Desktop erstellen
		Else
			_GUICtrlStatusBar_SetIcon($hStatus, 0, $ahIcons[2]) ; Icon fuer die linke Seite der Statuszeile setzen
			_GUICtrlStatusBar_SetText($hStatus, 'Eine Verknüfung ist schon vorhanden...', 0) ; Hinweis in der Statuszeile
		EndIf
	EndIf
	Sleep(3000)
	_GUICtrlStatusBar_SetText($hStatus, 'Bereit.', 0) ; die linke Statuszeile aktualisieren
	_GUICtrlStatusBar_SetIcon($hStatus, 0, $ahIcons[0]) ; das Icon setzen
EndFunc   ;==>_Verknuefnung

Func _Control_Change() ; Positionen einiger Control's verändern, wenn Hauptfenster maximiert order normalisiert wurde...
	Local $aWinPos = WinGetPos($hGUI) ; die letzte Position des Hauptfensters holen
	$fMaximize = BitAND(WinGetState($hGUI), 32) = 32 ; Hauptfenster maximiert ?
	Select
		Case $fMaximize = True ; ja
			GUICtrlSetPos($group[2], 4, 0, $aWinPos[2] - 15, $aWinPos[3] - 108)
			GUICtrlSetPos($group[0], 4, 0, $aWinPos[2] - 15, 38)
			GUICtrlSetPos($clock, ($aWinPos[2] / 2) - 5, 13, 90)
			GUICtrlSetPos($idListView, 12, 70, $aWinPos[2] - 26, $aWinPos[3] - 186)
			GUICtrlSetPos($start, 10, $aWinPos[3] - 102)
			If $iWidth = 800 Then
				GUICtrlSetPos($cpu, $aWinPos[2] - 660, 13)
				GUICtrlSetPos($speicher, $aWinPos[2] - 136, 13)
			ElseIf $iWidth = 1024 Then
				GUICtrlSetPos($cpu, $aWinPos[2] - 724, 13)
				GUICtrlSetPos($speicher, $aWinPos[2] - 146, 13)
			ElseIf $iWidth = 1152 Then
				GUICtrlSetPos($cpu, $aWinPos[2] - 666, 13)
				GUICtrlSetPos($speicher, $aWinPos[2] - 146, 13)
			ElseIf $iWidth = 1280 Then
				GUICtrlSetPos($cpu, $aWinPos[2] - 608, 13)
				GUICtrlSetPos($speicher, $aWinPos[2] - 146, 13)
			EndIf
			If $unlocker = 0 Then
				GUICtrlSetPos($input, 440, 42, 60, 20)
				GUICtrlSetPos($label, 510, 46)
			Else
				GUICtrlSetPos($input, 440, 42, 84, 20)
				GUICtrlSetPos($label, 536, 46)
			EndIf
		Case $fMaximize = False ; nein
			$aWinPos = WinGetPos($hGUI) ; die letzte Position des Hauptfensters holen
			GUICtrlSetPos($clock, ($aWinPos[2] / 2) - 5, 13)
			GUICtrlSetPos($start, 10, $aWinPos[3] - 102)
			GUICtrlSetPos($group[2], 4, 0, $aWinPos[2] - 15, $aWinPos[3] - 108)
			GUICtrlSetPos($idListView, 12, 70, $aWinPos[2] - 25, $aWinPos[3] - 186)
			If $iWidth = 800 Then
				GUICtrlSetPos($cpu, $aWinPos[2] - 475, 13)
				GUICtrlSetPos($speicher, $aWinPos[2] - 130, 13)
			ElseIf $iWidth = 1024 Then
				GUICtrlSetPos($cpu, $aWinPos[2] - 590, 13)
				GUICtrlSetPos($speicher, $aWinPos[2] - 140, 13)
			ElseIf $iWidth = 1152 Then
				GUICtrlSetPos($cpu, $aWinPos[2] - 660, 13)
				GUICtrlSetPos($speicher, $aWinPos[2] - 140, 13)
			ElseIf $iWidth = 1280 Then
				GUICtrlSetPos($cpu, $aWinPos[2] - 730, 13)
				GUICtrlSetPos($speicher, $aWinPos[2] - 140, 13)
			EndIf
			If $unlocker = 0 Then
				GUICtrlSetPos($input, 440, 42, 60, 20)
				GUICtrlSetPos($label, 510, 46)
			Else
				GUICtrlSetPos($input, 440, 42, 84, 20)
				GUICtrlSetPos($label, 536, 46)
			EndIf
	EndSelect
EndFunc   ;==>_Control_Change

Func _MyToolTip($Text)
	Local $a, $b, $pPID, $pPath, $ProcessDescription, $ProcessOwner, $gText, $texttemp
	Local $Pfadtext = 'Pfad:' & @CR
	Local $CommandText = 'Kommando:' & @CR
	Local $ProcOwnerText = 'User Name:' & @CR
	Local $ProcDescriptionText = 'Beschreibung: '

	$pPID = _Process_GetPID($Text) ; PID vom Prozess
	$pPath = _GetProcessPath($pPID) ; Pfad vom Prozess
	$Pfadtext = $Pfadtext & $pPath

	$ProcessOwner = _GetProcessOwner($pPID) ; User Name vom Prozess
	If IsNumber($ProcessOwner) Then $ProcessOwner = ''
	If $Text = '[System Process]' Then $ProcessOwner = 'NT-AUTORITÄT\SYSTEM'

	$ProcessDescription = _GetProcessDescription($pPID) ; Beschreibung vom Prozess
	If $Text = 'audiodg.exe' Then $ProcessDescription = 'Windows Graphisolierung für Audiogeräte'
	If $Text = '[System Process]' Then $ProcessDescription = 'System Idle Process'
	If $Text = 'System' Then $ProcessDescription = 'NT Kernel & System'
	If $Text = 'Memory Compression' Then $ProcessDescription = 'N/A'
	If $Text = 'SppExtComObj.Exe' Then $ProcessDescription = 'KMS Connection Broker'
	If $Text = 'NisSrv.exe' Then $ProcessDescription = 'Microsoft Network Realtime Inspection Service'

	For $xx = 0 To UBound($extra_names) - 1
		If $Text = $extra_names[$xx] Then ; Prozessname = Extraname ?
			$ProcessDescription = $eDescription[$xx] ; Beschreibung
			$CommandText = $CommandText & $pPath
			ExitLoop
		EndIf
	Next

	$texttemp = _CommandLine($pPID)
	If StringLen($texttemp) > 99 Then ; Stringlänge etwas kürzen...
		Do
			$a = StringMid($texttemp, 1, 99)
			$b = StringMid($texttemp, 100, StringLen($texttemp))
			$gText = $gText & $a & @CR
			$texttemp = $b
		Until StringLen($texttemp) < 99 ; wenn Stringlänge kleiner als 100 Zeichen, dann weiter machen
		$gText = $gText & $b & @CR
		If $Text = 'audiodg.exe' Then
			$Pfadtext = $Pfadtext & $extrapfad & $Text & @CR
			$CommandText = $CommandText & $extrapfad & $Text & @CR
		ElseIf $Text = 'Memory Compression' Then
			$Pfadtext = '' & @CR
			$CommandText = 'Memory Compression' & @CR
		ElseIf $Text = 'System Idle Process' Then
			$Pfadtext = $extrapfad & 'ntoskrnl.exe' & @CR
			$CommandText = $Text & @CR
		ElseIf $Text = 'System' Then
			$Pfadtext = '' & @CR
			$CommandText = $Text & @CR
		EndIf
	ElseIf StringLen($texttemp) = 0 Then
		$gText = $Text & @CR
	Else
		$gText = $texttemp & @CR
	EndIf
	If $Text = 'iexplore.exe' Then $gText = @HomeDrive & '\Program Files\Internet Explorer\' & $Text & @CR
	$CommandText = $CommandText & $gText
	$ProcOwnerText = $ProcOwnerText & $ProcessOwner & @CR
	$ProcDescriptionText = $ProcDescriptionText & $ProcessDescription & @CR
	ToolTip($CommandText & $ProcDescriptionText & $ProcOwnerText)
EndFunc   ;==>_MyToolTip
;===============================================================================
; Function Name: _System_Processlist() ; Function by TV_Freeze
;
Func _System_Processlist()
	Local $avProcs, $aProcessList
	Local $avProcs[1][2] = [[0, ""]]

	$aProcessList = ProcessList()
	ReDim $avProcs[$aProcessList[0][0] + 1][6] ; Größe des Array ändern
	For $i = 0 To $aProcessList[0][0]
		; 	Name
		ReDim $Processnames[UBound($Processnames) + 1] ; Größe des Array ändern
		$Processnames[$i] = $aProcessList[$i][0]
		If $Processnames[$i] = '[System Process]' Then
			$Processnames[$i] = 'System Idle Process'
		EndIf
		$avProcs[$i][0] = $Processnames[$i] ; eintragen
		;	PID
		ReDim $ProcessPIDs[UBound($ProcessPIDs) + 1] ; Größe des Array ändern
		$ProcessPIDs[$i] = $aProcessList[$i][1]
		$avProcs[$i][1] = $aProcessList[$i][1] ; eintragen
		; Path
		ReDim $Processpaths[UBound($Processpaths) + 1] ; Größe des Array ändern
		$Processpaths[$i] = _GetProcessPath($ProcessPIDs[$i])

		If $Processnames[$i] = 'audiodg.exe' Then
			$Processpaths[$i] = $extrapfad & $Processnames[$i]
		ElseIf $Processnames[$i] = 'csrss.exe' Then
			$Processpaths[$i] = $extrapfad & $Processnames[$i]
		ElseIf $Processnames[$i] = 'lsass.exe' Then
			$Processpaths[$i] = $extrapfad & $Processnames[$i]
		ElseIf $Processnames[$i] = 'smss.exe' Then
			$Processpaths[$i] = $extrapfad & $Processnames[$i]
		ElseIf $Processnames[$i] = 'services.exe' Then
			$Processpaths[$i] = $extrapfad & $Processnames[$i]
		ElseIf $Processnames[$i] = 'SecurityHealthService.exe' Then
			$Processpaths[$i] = $extrapfad & $Processnames[$i]
		ElseIf $Processnames[$i] = 'Memory Compression' Then
			$Processpaths[$i] = '' ; No Path
		ElseIf $Processnames[$i] = '[System Process]' Then
			$Processpaths[$i] = 'System Idle Process' ; No Path
		ElseIf $Processnames[$i] = 'System' Then
			$Processpaths[$i] = $extrapfad & 'ntoskrnl.exe'
		ElseIf $Processnames[$i] = 'sppsvc.exe' Then
			$Processpaths[$i] = $extrapfad & $Processnames[$i]
		ElseIf $Processnames[$i] = 'SppExtComObj.Exe' Then
			$Processpaths[$i] = $extrapfad & $Processnames[$i]
		ElseIf $Processnames[$i] = 'svchost.exe' Then
			$Processpaths[$i] = $extrapfad & $Processnames[$i]
		ElseIf $Processnames[$i] = 'wininit.exe' Then
			$Processpaths[$i] = $extrapfad & $Processnames[$i]
		ElseIf $Processnames[$i] = 'MsMpEng.exe' Or $Processnames[$i] = 'NisSrv.exe' Then
			$Processpaths[$i] = 'C:\Program Files\Windows Defender\' & $Processnames[$i]
		ElseIf $Processnames[$i] = 'iexplore.exe' Then
			$Processpaths[$i] = @HomeDrive & '\Program Files\Internet Explorer\' & $Processnames[$i]
		EndIf
		$avProcs[$i][2] = $Processpaths[$i] ; eintragen
	Next
	Return $avProcs ; alles zurück schicken
EndFunc   ;==>_System_Processlist

;rückt den Pfad des Prozesses raus
Func _GetProcessPath($hPID)
	Local Static $oWMI = ObjGet("winmgmts:{impersonationLevel=impersonate,authenticationLevel=pktPrivacy, (Debug)}!\\" & "." & "\root\cimv2")
	If IsObj($oWMI) Then
		For $o In $oWMI.ExecQuery("Select * from Win32_Process WHERE ProcessID=" & $hPID, "WQL", 48)
			Return $o.ExecutablePath
		Next
	Else
		SetError(1) ; Error connecting to WMI
	EndIf
EndFunc   ;==>_GetProcessPath

;rückt die Identifizierungsnummer des Prozesses raus
Func _Process_GetPID($sProcess)
	Local $aProcess = ProcessList($sProcess) ; List processes with that name
	If @error Or $aProcess[0][0] = 0 Then Return SetError(@error, False) ; Return False & set @error to non-zero if an error
	Return $aProcess[1][1] ; Return the PID
EndFunc   ;==>_Process_GetPID

;rückt den Kommando Aufruf des Prozesses raus
Func _CommandLine($hPID)
	Local Static $oWMI = ObjGet("winmgmts:{impersonationLevel=impersonate,authenticationLevel=pktPrivacy, (Debug)}!\\" & "." & "\root\cimv2")
	If IsObj($oWMI) Then
		For $o In $oWMI.ExecQuery("Select * from Win32_Process WHERE ProcessID=" & $hPID, "WQL", 48)
			Return $o.CommandLine
		Next
	Else
		SetError(1) ; Error connecting to WMI
	EndIf
EndFunc   ;==>_CommandLine

;rückt den System Namen oder Benutzer Namen des Prozesses raus
Func _GetProcessOwner($hPID)
	Local $sUserName, $sUserDomain
	Local Static $oWMI = ObjGet("winmgmts:{impersonationLevel=impersonate,authenticationLevel=pktPrivacy, (Debug)}!\\" & "." & "\root\cimv2")
	If IsObj($oWMI) Then
		For $o In $oWMI.ExecQuery("Select * from Win32_Process WHERE ProcessID=" & $hPID, "WQL", 48)
			If $o.GetOwner($sUserName, $sUserDomain) = 0 Then
				Return $sUserDomain & "\" & $sUserName
			Else
				Return $o.GetOwner
			EndIf
		Next
	Else
		SetError(1) ; Error connecting to WMI
	EndIf
EndFunc   ;==>_GetProcessOwner

;Gibt die Beschreibung eines Prozesses zurück wie sie im Task-Manager angezeigt wird
Func _GetProcessDescription($hPID)
	Local $PID
	;by AspirinJunkie
	$PID = ProcessExists($hPID)
	If $PID = 0 Then Return SetError(1, 0, "")

	Local Const $pfad = _GetProcessPath($hPID)
	If @error Then Return SetError(2, @error, "")

	Local Const $Description = FileGetVersion($pfad, "FileDescription")
	If @error Then Return SetError(3, @error, "")

	Return $Description
EndFunc   ;==>_GetProcessDescription

;rückt die Informationen des Betriebssystem raus
Func _CI_GetWindowsInfo($strComputer = '.')
	Local $aReturn[2][4] = [['Betriebssystem:', 'Version:', 'Sprachversion:', 'Hauptspeicher:']]
	Local $aTmp, $sOSLang = @OSLang
	Local $x = 0, $objWMIService, $colItems, $aMemory = MemGetStats(), $sX64 = ''
	$aTmp = DllCall('kernel32.dll', 'int', 'GetLocaleInfo', 'dword', '0x' & $sOSLang, 'dword', BitOR(0x2, 0x80000000), 'str', '', 'int', 85)
	If @OSArch <> 'X86' Then $sX64 = '64'
	$objWMIService = ObjGet('winmgmts:\\' & $strComputer & '\root\cimv2')
	If Not IsObj($objWMIService) Then Return SetError(1, 0, 0)
	$colItems = $objWMIService.ExecQuery('SELECT * FROM Win32_OperatingSystem', 'WQL', 0x30)
	If IsObj($colItems) Then
		For $objItem In $colItems
			$aReturn[1][0] = $objItem.Caption & ' (' & @OSArch & ')' ; Name des Betriebssystems lesen
			$aReturn[1][1] = $objItem.Version ; Windows Version lesen
			$aReturn[1][2] = $sOSLang ; Windos Sprache lesen
			$aReturn[1][3] = _ByteAutoSize($aMemory[1] * 1024, 1, 4) ; Haupspeicher lesen
		Next
	EndIf
	Return $aReturn
EndFunc   ;==>_CI_GetWindowsInfo

;rückt den Namen des Haupt-Prozessors raus
Func _CI_GetCPU($strComputer = '.')
	Local Static $oWMI = ObjGet('winmgmts:\\' & $strComputer & '\root\cimv2')
	If IsObj($oWMI) Then
		For $o In $oWMI.ExecQuery('Select * from Win32_Processor', "WQL", 48)
			Return $o.Name
		Next
	Else
		SetError(1) ; Error connecting to WMI
	EndIf
EndFunc   ;==>_CI_GetCPU

;===============================================================================
; Function Name:   _ByteAutoSize($iSize[, $iRound][, $iFormat][, $bThousands])
; Description::    Gibt einen Bytewert in einer bestimmten Einheit zurück
; Parameter(s):    $iSize = Größe in Byte übergeben
;                  $iRound = Anzahl der Nachkommastellen (0...8)
;                  $iFormat = bestimmt den Rückgabewert
;                     0 = Automatisch (je nach übergebenen Wert)
;                     1 = in Byte
;                     2 = in KByte
;                     3 = in MByte
;                     4 = in GByte
;                  $bThousands = Rückgabe mit Tausendertrennzeichen (True/False)
; Requirement(s):  #include <String.au3>
; Author(s):       Oscar (www.autoit.de)
;===============================================================================
Func _ByteAutoSize($iSize, $iRound = 2, $iFormat = 0, $bThousands = True)
	Local $aSize[4] = [' Byte', ' KByte', ' MByte', ' GByte'], $sReturn
	If $iFormat < 0 Or $iFormat > 4 Then $iFormat = 0
	If $iRound < 0 Or $iRound > 8 Then $iRound = 2
	If Not IsBool($bThousands) Then $bThousands = False
	$iSize = Abs($iSize)
	If $iFormat = 0 Then
		For $i = 30 To 0 Step -10
			If $iSize > (2 ^ $i) Then
				$iFormat = $i / 10 + 1
				ExitLoop
			EndIf
		Next
	EndIf
	If $iFormat = 0 Then $iFormat = 1
	$sReturn = StringFormat('%.' & $iRound & 'f', Round($iSize / (2 ^ (($iFormat - 1) * 10)), $iRound))
	If $bThousands Then $sReturn = _StringAddThousandsSep($sReturn, '.', ',')
	Return $sReturn & $aSize[$iFormat - 1]
EndFunc   ;==>_ByteAutoSize

; #FUNCTION# ====================================================================================================================
; Name...........: _StringAddThousandsSep
; Description ...: Returns the original numbered string with the Thousands delimiter inserted.
; Syntax.........: _StringAddThousandsSep($sString[, $sThousands = -1[, $sDecimal = -1]])
; Parameters ....: $sString    - The string to be converted.
;                  $sThousands - Optional: The Thousands delimiter
;                  $sDecimal   - Optional: The decimal delimiter
; Return values .: Success - The string with Thousands delimiter added.
; Author ........: SmOke_N (orignal _StringAddComma
; Modified.......: Valik (complete re-write, new function name)
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......; Yes
; ===============================================================================================================================
Func _StringAddThousandsSep($sString, $sThousands = -1, $sDecimal = -1)
	Local $sResult = "" ; Force string
	Local $rKey = "HKCU\Control Panel\International"
	If $sDecimal = -1 Then $sDecimal = RegRead($rKey, "sDecimal")
	If $sThousands = -1 Then $sThousands = RegRead($rKey, "sThousand")
	Local $aNumber = StringRegExp($sString, "(\D?\d+)\D?(\d*)", 1) ; This one works for negatives.
	If UBound($aNumber) = 2 Then
		Local $sLeft = $aNumber[0]
		While StringLen($sLeft)
			$sResult = $sThousands & StringRight($sLeft, 3) & $sResult
			$sLeft = StringTrimRight($sLeft, 3)
		WEnd
		$sResult = StringTrimLeft($sResult, StringLen($sThousands)) ; Strip leading thousands separator
		If $aNumber[1] <> "" Then $sResult &= $sDecimal & $aNumber[1]
	EndIf
	Return $sResult
EndFunc   ;==>_StringAddThousandsSep

;===============================================================================
; Description:      Returns the services information in an array.
; Parameter(s):     $aServicesInfo - By Reference - Services Information array.
;                   $sState - OPTIONAL - Accepted values 'All' or 'Stopped' or
;                                       'Running'
; Requirement(s):   None
; Return Value(s):  On Success - Returns array of Services Information.
;                       $aServicesInfo[$i][0]  = Name
;                       $aServicesInfo[$i][1]  = Accept Pause
;                       $aServicesInfo[$i][2]  = Accept Stop
;                       $aServicesInfo[$i][3]  = Check Point
;                       $aServicesInfo[$i][4]  = Description
;                       $aServicesInfo[$i][5]  = Creation Class Name
;                       $aServicesInfo[$i][6]  = Desktop Interact
;                       $aServicesInfo[$i][7]  = Display Name
;                       $aServicesInfo[$i][8]  = Error Control
;                       $aServicesInfo[$i][9]  = Exit Code
;                       $aServicesInfo[$i][10] = Path Name
;                       $aServicesInfo[$i][11] = Process ID
;                       $aServicesInfo[$i][12] = Service Specific Exit Code
;                       $aServicesInfo[$i][13] = Service Type
;                       $aServicesInfo[$i][14] = Started
;                       $aServicesInfo[$i][15] = Start Mode
;                       $aServicesInfo[$i][16] = Start Name
;                       $aServicesInfo[$i][17] = State
;                       $aServicesInfo[$i][18] = Status
;                       $aServicesInfo[$i][19] = System Creation Class Name
;                       $aServicesInfo[$i][20] = System Name
;                       $aServicesInfo[$i][21] = Tag ID
;                       $aServicesInfo[$i][22] = Wait Hint
;
;                   On Failure - @error = 1 and Returns 0
;                               @extended = 1 - Array contains no information
;                                           2 - $colItems isnt an object
; Author(s):        Jarvis Stubblefield (support "at" vortexrevolutions "dot" com)
; Note(s):
;===============================================================================
Func _ComputerGetServices(ByRef $aServicesInfo, $sState = "All")
	Local $cI_Compname = @ComputerName, $wbemFlagReturnImmediately = 0x10, $wbemFlagForwardOnly = 0x20
	Local $colItems, $objWMIService, $objItem
	Dim $aServicesInfo[1][23], $i = 1
	$objWMIService = ObjGet("winmgmts:\\" & $cI_Compname & "\root\CIMV2")
	$colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_Service", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)

	If IsObj($colItems) Then
		For $objItem In $colItems
			If $sState <> "All" Then
				If $sState = "Stopped" And $objItem.State <> "Stopped" Then ContinueLoop
				If $sState = "Running" And $objItem.State <> "Running" Then ContinueLoop
			EndIf
			ReDim $aServicesInfo[UBound($aServicesInfo) + 1][23]
			$aServicesInfo[$i][0] = $objItem.name
			$aServicesInfo[$i][1] = $objItem.AcceptPause
			$aServicesInfo[$i][2] = $objItem.AcceptStop
			$aServicesInfo[$i][3] = $objItem.CheckPoint
			$aServicesInfo[$i][4] = $objItem.Description
			$aServicesInfo[$i][5] = $objItem.CreationClassName
			$aServicesInfo[$i][6] = $objItem.DesktopInteract
			$aServicesInfo[$i][7] = $objItem.DisplayName
			$aServicesInfo[$i][8] = $objItem.ErrorControl
			$aServicesInfo[$i][9] = $objItem.ExitCode
			$aServicesInfo[$i][10] = $objItem.PathName
			$aServicesInfo[$i][11] = $objItem.ProcessId
			$aServicesInfo[$i][12] = $objItem.ServiceSpecificExitCode
			$aServicesInfo[$i][13] = $objItem.ServiceType
			$aServicesInfo[$i][14] = $objItem.Started
			$aServicesInfo[$i][15] = $objItem.StartMode
			$aServicesInfo[$i][16] = $objItem.StartName
			$aServicesInfo[$i][17] = $objItem.State
			$aServicesInfo[$i][18] = $objItem.status
			$aServicesInfo[$i][19] = $objItem.SystemCreationClassName
			$aServicesInfo[$i][20] = $objItem.SystemName
			$aServicesInfo[$i][21] = $objItem.TagId
			$aServicesInfo[$i][22] = $objItem.WaitHint
			$i += 1
		Next
		$aServicesInfo[0][0] = UBound($aServicesInfo) - 1
		If $aServicesInfo[0][0] < 1 Then
			SetError(1, 1, 0)
		EndIf
	Else
		SetError(1, 2, 0)
	EndIf
EndFunc   ;==>_ComputerGetServices

; Thanx to UEZ for -> File to Base64 String Code Generator !!!
Func _ProcessIco($bSaveBinary = False, $sSavePath = $sAppDir)
	Local $Processico
	$Processico &= 'ALVIAAABABAwMAFwCAAAqA4AABYAAMwAKAAYAJAAYAAYAVwBGQD/ZBcAi3ZKAACOeUkAkXxHAACVf0YAmIJFAQCI9AARMuEAGgA41gA0R7gAawBneQCbhUQAMwBHugCUgUwAnwCIQwA0SLoAogCLQgBvbHoApQCOQQCYhk8AgQB4aABDUqsANgBKuQCpkUAAVABcmgAQMuMArACUPwCkj0gArwCXPgCnkkcAswCaPQBZYZkAHAA61wC2nTwAnwCOUwCIgGoARQBUrwBHVqwAugCgOwADKvEAmgCLWwC9ojoAYQRnlAATPQA+ULcAABIz4gCfj1cAAMClOQAGLO4AAGxuiwA/UbYAAAww6ACikVYAAMGlNwAYONwAADZLvwBjaJMAAK+ZSQBVX6EAAAku6wCUiGMAAL+iNABdY5cEAImAN72fMgBqAGuHAH94cgC7AJwwAHVwegBsAGuDALmZLQB8BHRvgHG8ALeWKwAAj35XALWTKAAAGjfXAB860QAAspErALOQJgAAO0qwAKiJMwAAFDPdAF9fhwAAsY0kADJFuQAArosnAHltZQAACC3qAJuAPgAAr4khAKeEKwAAN0ayADRFtQAArYYfAJp8NgAACCzqAHRnZQAAqoMdAF1afwAAEzLcAJ99KgAAqIAaAKV/HQAAIDnLAEpPlAAApn0YAIJqSAAAAynxAIRsRQAApHoVAKJ3E/AAoHQR2nc/AD8APwC/PwA/AD8APwA/AAsAAR8A/wYAHwbNBWAA/wTnBYUAHwC/JgU/HGsdvwT/BfwFcR8AuwAA5wVwHwAAAOcFbx8AiwAA5wVrEgAHBwcDAYBsbQdtbmtr5wUOZxIA4AXiAGhpBwd2auAA5wVjEgDgBeIAZLAHB2Vm4ADnBV8SAIPgBcEAYGEHB2IBAdHnBVtbW4ADB8AACQCFIAJcwABdBwde4gHx5wVVVVXhBcAACQAgAgBWV1VYBwdZWuPiAecFUFBQ4QXAAAkAgUECUVJTBwdU4wHx5wVMTEyBA8AACQBBAsAHTQcHTk/jAecFeEpKSmEDwAAJACACKI3BAkvkAecFR0dHAQPXwAAJACACSAAGSeUB5wV4RERE8QJgAAkAEQFFjUAARvQA9wJBQUHxAtdgAAkAEgFCQAlD8wD3Ang+Pj7xAmAACQATAT+NAANA8gD3AjY2NsIQwQEANDc4OToAASIBwWEAOwcHPD2BAPcCmDAwMPYCAQAxMhAB0yEBYQAwM0AENXAA9wKIKioq+gIHBysjAQFQACoqLC0HBy6ILyoq9wInJyf8AhwoKTABDAD3AiIiIoNBAmAAIiIjJCWxAI4mwgAKAPcCHx8fMQLrYAACACCwACHFAAcA9wK4HR0d8QJgAAIAHskA4wcA9wIbGxshAmAAAgCOHMkABwD3AhgYGCEC62AAAgAZsAAaxQAHAPcCGBMTE/ECYAATExR0FRaxABfCAAoA9wIR5BER/BQHEjABDAD3AugPDw/sAhAgAQ0A9wLIDAwM6wINDiABDQAR9wIGBga3AggJCm4LAAEPAPcCBQ8ADwAFrfcCBA8ADwAE9wIDDwC1DwAD9wICDwAPAAL/aP8PAP9o/wIPAP8CDwAPAPYC/595DwDvfQ8ADwPhg/8CDwD/74kPAA8Avw4PAA8ADwAPAP8PAA8ADwAPAA8ADwAPAA8A/w8ADwAPAA8ADwAPAA8ADwABBwA='
	$Processico = _Base64Decode($Processico)
	Local $tSource = DllStructCreate('byte[' & BinaryLen($Processico) & ']')
	DllStructSetData($tSource, 1, $Processico)
	Local $tDecompress
	_WinAPI_LZNTDecompress($tSource, $tDecompress)
	$tSource = 0
	Local $bString = Binary(DllStructGetData($tDecompress, 1))
	If $bSaveBinary Then
		Local $hFile = FileOpen($sAppDir & "Prozess.ico", $FO_OVERWRITE + $FO_BINARY) ; Write mode (erase previous contents) & Force binary mode
		If @error Or $hFile = -1 Then ; wenn das Icon nicht erstellt werden konnte, dann...
			MsgBox($MB_OK, $sTitle & $sVersion, 'Es konnte das Icon nicht im Anwendungsordner erstellt werden!' & @CRLF & 'Das Programm wird beendet...') ; das Programm mit einer Fehlermeldung beenden
			FileDelete($sAppDir & "Process.ico")
			Exit
		EndIf
		FileWrite($hFile, $bString) ; schreibe File
		FileClose($hFile)
	EndIf
	Return $bString
EndFunc   ;==>_ProcessIco

Func _ClockIcon($bSaveBinary = False, $sSavePath = $sAppDir)
	Local $ClockIcon
	$ClockIcon &= 'AAABAAEAEBAAAAEAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////////////////Q3NZ3m4g9cVYjXj4jXj49cVZ3m4jQ3Nb////////////////////////1+PZ1mYcoZ0U4j2FDq3RIuH1IuH1Dq3Q4j2EoZ0V2mof1+Pb////////////1+PZYhG02gFlOuoJRwIZRwIZRwIZRwIZRwIZRwIZOuoI2gFlYhG31+Pb///////96m4s7gl5Yw41YxI1YxI1YxI1YxI1YxI1YxI1YxI1YxI1Yw407gl56nIv////T3tk0bFBcwY9fx5Rfx5Rfx5Rfx5Rfx5Rfx5Rfx5Rfx5Rfx5Rfx5RcwY80bFDT3tmCoJJNmXVmy5tmy5tmy5tmy5tmy5tmy5tmy5tmy5tmy5tmy5tmy5tmy5tNmXWCoZJQemdju5JuzqFuzqFuzqFuzqFuzqFuzqFuzqFuzqFuzqFuzqFuzqFuzqFju5JQemc9alZzzaV10qh10qh10qh10qh10qhYn39Bdl5Nim9Zn4BktJBwyaF10qhyzaQ9alZAa1h40Kp71a571a571a571a571K5Bb1s+bFhNhGxZmX1lro9yxKB71a540KpAa1hYfm50wqKB17KB17KB17KB17KB17JNgGpNgGqB17KB17KB17KB17KB17J0wqJYfm6LpZplo4qG2beG2beG2beG2beG2bdakXpakXqG2beG2beG2beG2beG2bdlo4qLpZvY4NxMd2aH1LaM27yM27yM27yM27xnootnoouM27yM27yM27yM27yH1LZMd2bY4Nz///+MpJpgkn+Q27+R3cCR3cCR3cB2s5x2s5yR3cCR3cCR3cCQ279gkn+MpJv////////3+Ph0j4Vkk4KS2L+X38WX38WFxK6FxK6X38WX38WS2L9kk4J0j4X3+Pj////////////3+PiPpZ1Vem11qZiNy7aR0byR0byNy7Z1qZhVem2PpZ33+Pj////////////////////////a4N6TqKJng3pTcmhTcmhng3qTqKLa4N7///////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
	Local $bString = Binary(_Base64Decode($ClockIcon))
	If $bSaveBinary Then
		Local $hFile = FileOpen($sAppDir & "Clock.ico", $FO_OVERWRITE + $FO_BINARY) ; Write mode (erase previous contents) & Force binary mode
		If @error Or $hFile = -1 Then ; wenn das Bild nicht erstellt werden konnte, dann...
			MsgBox($MB_OK, $sTitle & $sVersion, 'Es konnte das Logo nicht im Anwendungsordner erstellt werden!' & @CRLF & 'Das Programm wird beendet...') ; das Programm mit einer Fehlermeldung beenden
			FileDelete($sAppDir & "Clock.ico")
			Exit
		EndIf
		FileWrite($hFile, $bString) ; schreibe File
		FileClose($hFile)
	EndIf
	Return $bString
EndFunc   ;==>_ClockIcon

Func _MyLogo($bSaveBinary = False, $sSavePath = $sAppDir)
	Local $MyLogo
	$MyLogo &= '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'
	$MyLogo &= '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'
	$MyLogo &= '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'
	$MyLogo &= 'AF8A/+wv/49fAF8AXwBfAF8AXwD/XwBfAF8AXwD/L18AXwAvAP8vAC8ALwAvAC8ALwAvAC8A/y8ALwAvAC8ALwAvAP8X/xf/LwAvAC8ALwAvAC8ALwAvAP8vAC8ALwAvAC8ALwAvAC8AHy8ALwAvAC8A93fqzs5RIADpz88gAOgjAM7+ziEAsgB5AbcA8gI0ArsD878AvwDpziEA4wN8B58I/58InwifCP8CvwCfCH8HeQE/vwk/Ar8JvQlTAyIAFwUCBfAX'
	$MyLogo = _Base64Decode($MyLogo)
	Local $tSource = DllStructCreate('byte[' & BinaryLen($MyLogo) & ']')
	DllStructSetData($tSource, 1, $MyLogo)
	Local $tDecompress
	_WinAPI_LZNTDecompress($tSource, $tDecompress)
	$tSource = 0
	Local $bString = Binary(DllStructGetData($tDecompress, 1))
	If $bSaveBinary Then
		Local $hFile = FileOpen($sAppDir & "MyLogo.bmp", $FO_OVERWRITE + $FO_BINARY) ; Write mode (erase previous contents) & Force binary mode
		If @error Or $hFile = -1 Then ; wenn das Bild nicht erstellt werden konnte, dann...
			MsgBox($MB_OK, $sTitle & $sVersion, 'Es konnte das Logo nicht im Anwendungsordner erstellt werden!' & @CRLF & 'Das Programm wird beendet...') ; das Programm mit einer Fehlermeldung beenden
			FileDelete($sAppDir & "MyLogo.bmp")
			Exit
		EndIf
		FileWrite($hFile, $bString) ; schreibe File
		FileClose($hFile)
	EndIf
	Return $bString
EndFunc   ;==>_MyLogo

Func _Base64Decode($input_string)
	Local $struct = DllStructCreate("int")
	Local $a_Call = DllCall("Crypt32.dll", "int", "CryptStringToBinary", "str", $input_string, "int", 0, "int", 1, "ptr", 0, "ptr", DllStructGetPtr($struct, 1), "ptr", 0, "ptr", 0)
	If @error Or Not $a_Call[0] Then Return SetError(1, 0, "")
	Local $a = DllStructCreate("byte[" & DllStructGetData($struct, 1) & "]")
	$a_Call = DllCall("Crypt32.dll", "int", "CryptStringToBinary", "str", $input_string, "int", 0, "int", 1, "ptr", DllStructGetPtr($a), "ptr", DllStructGetPtr($struct, 1), "ptr", 0, "ptr", 0)
	If @error Or Not $a_Call[0] Then Return SetError(2, 0, "")
	Return DllStructGetData($a, 1)
EndFunc   ;==>_Base64Decode

Func _WinAPI_LZNTDecompress(ByRef $tInput, ByRef $tOutput, $iBufferSize = 0x800000)
	Local $tBuffer, $Ret
	$tOutput = 0
	$tBuffer = DllStructCreate('byte[' & $iBufferSize & ']')
	If @error Then Return SetError(1, 0, 0)
	$Ret = DllCall('ntdll.dll', 'uint', 'RtlDecompressBuffer', 'ushort', 0x0002, 'ptr', DllStructGetPtr($tBuffer), 'ulong', $iBufferSize, 'ptr', DllStructGetPtr($tInput), 'ulong', DllStructGetSize($tInput), 'ulong*', 0)
	If @error Then Return SetError(2, 0, 0)
	If $Ret[0] Then Return SetError(3, $Ret[0], 0)
	$tOutput = DllStructCreate('byte[' & $Ret[6] & ']')
	If Not _WinAPI_MoveMemory(DllStructGetPtr($tOutput), DllStructGetPtr($tBuffer), $Ret[6]) Then
		$tOutput = 0
		Return SetError(4, 0, 0)
	EndIf
	Return $Ret[6]
EndFunc   ;==>_WinAPI_LZNTDecompress

Func _WinAPI_MoveMemory($pDestination, $pSource, $iLenght)
	DllCall('ntdll.dll', 'none', 'RtlMoveMemory', 'ptr', $pDestination, 'ptr', $pSource, 'ulong_ptr', $iLenght)
	If @error Then Return SetError(5, 0, 0)
	Return 1
EndFunc   ;==>_WinAPI_MoveMemory

Func _Selected()
	For $i = 0 To UBound($sel) - 1 ; check all items for selected on/off
		If _GUICtrlListView_GetItemChecked($hListView, $i) = True Then
			$sel[$i] = 1
			_GUICtrlListView_SetItemDropHilited($hListView, $i)
		Else
			$sel[$i] = 0
			_GUICtrlListView_SetItemDropHilited($hListView, $i, False)
		EndIf
	Next
EndFunc   ;==>_Selected

Func _WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
	#forceref $hWnd, $iMsg, $wParam ; eine Anweisung an AutoIt, dass diese Variablen hier nicht verwendet werden
	Local $tNMHDR, $hWndFrom, $iCode, $tInfo, $Index, $sub, $gText, $iSelected
	Local $nID = BitAND($wParam, 0x0000FFFF)
	$tNMHDR = DllStructCreate($tagNMHDR, $lParam) ; Struktur erstellen
	$hWndFrom = HWnd(DllStructGetData($tNMHDR, 'hWndFrom')) ; das ausloesende Handle ermitteln
	$iCode = DllStructGetData($tNMHDR, 'Code') ; den ausloesenden Code ermitteln
	Switch $hWndFrom ; Welches Gui-Control-Element hat den Notify-Event ausgeloest
		Case $hListView ; wenn es das Listview war, dann...
			Switch $iCode ; mit welchem Code wurde der Event ausgeloest

				Case $LVN_HOTTRACK ; sendet wenn der Mauspfeil über ein Item vom ListView gefahren wird...
					If $ttip = 1 Then ; nur wenn im Menü eingeschaltet, dann weiter machen
						$tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam) ; Struktur erstellen
						$Index = DllStructGetData($tInfo, 'Index') ; den Index des Listviews ermitteln
						$sub = DllStructGetData($tInfo, "SubItem") ; Spalte des LiestViews ermitteln
						If $sub < 1 Then ; nur alles in der 1. Spalte abfragen
							$gText = _GUICtrlListView_GetItemText($hListView, $Index, 0) ; Text aus der LiestView-Spalte holen
							If $gText <> '' And $ttip = 1 Then
								_MyToolTip($gText)
							EndIf
						ElseIf $sub > 0 And $ttip = 1 Then ; wenn andere Spalte
							ToolTip('') ; kein ToolTip
						EndIf
					EndIf
					$iHotItem = _GUICtrlListView_GetHotItem($hListView) ; aktuelle Position der Zeile ermitteln

				Case $NM_CLICK ; Wird vom ListView gesendet, wenn der Benutzer ein Item mit der linken Maustaste klickt
					ToolTip('') ; kein ToolTip
					$tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam) ; Struktur erstellen
					$iSelected = DllStructGetData($tInfo, 'Index') ; den Index des Listviews ermitteln
					If $iSelected > -1 Then
						_GUICtrlListView_GetItemFocused($hListView, $iSelected)
						_Selected()
					EndIf

				Case $NM_DBLCLK ; Wird vom ListView gesendet, wenn der Benutzer ein Item mit der linken Maustaste doppelklickt
					$tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam) ; Struktur erstellen
					$iSelected = DllStructGetData($tInfo, 'Index') ; den Index des Listviews ermitteln
					If $iSelected > -1 Then
						If _GUICtrlListView_GetItemChecked($hListView, $iSelected) Then
							_GUICtrlListView_SetItemDropHilited($hListView, $iSelected, False)
							_GUICtrlListView_SetItemChecked($hListView, $iSelected, False)
							$sel[$iSelected] = 1
						Else
							_GUICtrlListView_SetItemDropHilited($hListView, $iSelected)
							_GUICtrlListView_SetItemChecked($hListView, $iSelected, True)
							$sel[$iSelected] = 0
						EndIf
					EndIf

			EndSwitch

		Case $hLVHeader ; wenn es die Titelleiste des Listviews war, dann...
			ToolTip('') ; kein ToolTip
			Switch $iCode ; mit welchem Code wurde der Event ausgeloest
				Case $HDN_ITEMCHANGED, $HDN_ITEMCHANGEDW ; wenn die Spaltenbreite geaendert wurde, dann...
					$tNMHEADER = DllStructCreate($tagNMHEADER, $lParam) ; Struktur erstellen
					$iItem = DllStructGetData($tNMHEADER, 'Item') ; die veraenderte Spalte ermitteln
					$aColWidth[$iItem] = _GUICtrlListView_GetColumnWidth($idListView, $iItem) ; die neue Spaltenbreite merken
			EndSwitch
	EndSwitch
	$tNMHEADER = 0 ; die benutzten Strukturen loeschen
	$tNMHDR = 0
	$tInfo = 0

	If $unlocker = 1 Then
		Switch $nID
			Case $updown
				Local $aContrPos = ControlGetPos($hGUI, '', $updown)
				If Not IsArray($aContrPos) Then Return 1
				Local $aMousePos = GUIGetCursorInfo($hGUI)
				If Not IsArray($aMousePos) Then Return 1
				If $aMousePos[1] > $aContrPos[1] + $aContrPos[3] / 2 Then
					If GUICtrlRead($input) > 1 Then
						GUICtrlSetData($input, GUICtrlRead($input) - 1)
					EndIf
				Else
					If GUICtrlRead($input) < 31536000 Then
						GUICtrlSetData($input, GUICtrlRead($input) + 1)
					EndIf
				EndIf
				If $backupZ <> GUICtrlRead($input) Then
					$backupZ = GUICtrlRead($input)
				EndIf
				Return 1
		EndSwitch
	EndIf
	$nr += 1
	If $nr > 5 Then
		$nr = 0
		_Selected() ; noch mal die Harken checken...
	EndIf
	Return $GUI_RUNDEFMSG ; Anweisung an Windows, dass es mit der normalen Abarbeitung fortfahren kann
EndFunc   ;==>_WM_NOTIFY

Func _WM_SIZE($hWnd, $iMsg, $wParam, $lParam) ; diese Funktion wird aufgerufen, wenn die Groesse des Hauptfensters geandert wurde
	#forceref $hWnd, $iMsg, $wParam ; eine Anweisung an AutoIt, dass diese Variablen hier nicht verwendet werden
	Local $iNewWidth = _WinAPI_LoWord($lParam) ; die neue Fensterbreite ermitteln
	_GUICtrlStatusBar_Resize($hStatus) ; die Statuszeile an die Groesse des Hauptfensters anpassen
	$aParts[0] = 400 + Int(($iNewWidth - $iWidthMin) / 2) ; den linken Teil der Statusleiste anpassen
	$aParts[1] = 520 + Int(($iNewWidth - $iWidthMin) / 2) ; den rechten Teil der Statusleiste anpassen
	_GUICtrlStatusBar_SetParts($hStatus, $aParts) ; und die neue Aufteilung setzen
	_Control_Change() ; einige Controls neu Positionieren
	Return $GUI_RUNDEFMSG ; Anweisung an Windows, dass es mit der normalen Abarbeitung fortfahren kann
EndFunc   ;==>_WM_SIZE

; Anmerkung!
;
; einige Programmzeilen wurden von Oscar's Scripte/ListViewDatenBank etz.
; übernommen, bzw. verändert.
; Ich bedanke mich dafuer.
; Bei "Beende Prozesse in Blockliste" steigt etwas die CPU-Last...
; I Love AutoIt ...
; Bye from TV_Freeze
;
