#RequireAdmin
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=ICON_385.ICO
#AutoIt3Wrapper_UseX64=n
#AutoIt3Wrapper_Au3Check_Parameters=-q -d -I dir -w1 -w2 -w3 -w4 -w5 -w6 -v1 -v2 -v3
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <Array.au3>
#include <System.au3>
#include <GuiTab.au3>
#include <GuiListView.au3>
#include <GuiImageList.au3>
#include <GuiStatusBar.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <ListViewConstants.au3>
#include <ProgressConstants.au3>

Opt('GUIOnEventMode', 1)
Opt('MustDeclareVars', 1)
Opt('WinTitleMatchMode', 3)

$Debug_LV = False

Global $Form[3]

Global $Breite = @DesktopWidth
Global $Hoehe = @DesktopHeight
Global $EigenPID = @AutoItPID
Global $Breite_K = 410
Global $Hoehe_K = 455

Global Const $WM_APPCOMMAND = 0x319
Global Const $tagNMHDR_0 = 'hwnd hWndFrom;uint_ptr IDFrom;INT Code'
Global Const $tagNMLISTVIEW_0 = $tagNMHDR_0 & ';int Item;int SubItem;int NewState;int OldState;int Changed;int ActionX;int ActionY;int Param'

Global $Tab
Global $WinTmp
Global $SYS[30]
Global $Null = 0
Global $Menue_SYS[2], $MenuItem_0, $iIndex
Global $aWinList, $aProcess, $aProcess_0, $Icon, $Trans = 0.2, $laenge = 400
Global $iParts[3] = [180, 780, 50], $iStatus, $Dienste, $mem, $iGetIthm = -1, $Checkbox[4], $Label, $Set_Label, $Set_Prio
Global $Bezeichnung_0[7][2] = [['Task', 260],['EXE', 60],['Status', 60],['PID', 40],['Handel', 100],['Pfad', 260],['Klassenname', 100]]
Global $LV_SYS[5], $Handle_LV_SYS[5], $Index = 0, $Contextmenu[3], $Contextmenuitem_0[3], $Contextmenuitem_1[3], $Contextmenuitem_2[2], $Prio_Item[4]
Global $Bezeichnung_1[8] = ['ProzesseName', 'PID', 'Parent PID', 'Eigentümer', 'Priorität', 'Ausführbaren Pfad', 'Geschriebenen Daten', 'Speichernutzung']
Global $Bezeichnung_2[10] = ['Interner Name', 'PID', 'Akzeptiert Pause', 'Akzeptiert Stop', 'Pfad', 'Status', 'Zustand', 'StartMode', 'StartName', 'Beschreibung']

Global Static $objRefresher = ObjCreate('WbemScripting.SWbemRefresher')
Global Static $objRefreshableItem = $objRefresher.AddEnum(ObjGet('winmgmts:\\' & @ComputerName & '\root\CIMV2'), 'Win32_PerfFormattedData_PerfOS_Processor')

$objRefresher.Refresh(0)

If IsObj($objRefreshableItem) Then Global Static $aCPU[$objRefreshableItem.ObjectSet.Count]
Global $Set_Prog = $Null, $core[UBound($aCPU) - 1], $l_core[UBound($aCPU) - 1], $P_core[UBound($aCPU) - 1]


If (@OSArch = 'X86') Then $Trans = 10

Switch UBound($aCPU) - 1
	Case 6
		$laenge += 150
	Case 8
		$laenge += 250
	Case 12
		$laenge += 450
EndSwitch

$Form[$Null] = GUICreate('Task_Manager v0.1', 870, 460, (@DesktopWidth - 870) / 2, (@DesktopHeight - 460) / 2, $WS_OVERLAPPEDWINDOW + $WS_CLIPSIBLINGS)
GUISetOnEvent(-3, 'Ende')

$Menue_SYS[$Null] = GUICtrlCreateMenu(' Datein ')
$MenuItem_0 = GUICtrlCreateMenuItem(' Neuer Task ( Ausführen.... ) ', $Menue_SYS[$Null])
GUICtrlSetOnEvent(-1, 'Anw_Prog_P_S')
GUICtrlCreateMenuItem(' Leistung ', $Menue_SYS[$Null])
GUICtrlSetOnEvent(-1, '_CPU_Darstellung')
GUICtrlCreateMenuItem(' Beenden ', $Menue_SYS[$Null])
GUICtrlSetOnEvent(-1, 'Ende')

$Tab = GUICtrlCreateTab(10, 8, 850, 400)
GUICtrlSetResizing(-1, $GUI_DOCKTOP + $GUI_DOCKLEFT + $GUI_DOCKBOTTOM + $GUI_DOCKRIGHT)

GUICtrlCreateTabItem('Anwendungen')
$LV_SYS[$Null] = GUICtrlCreateListView('', 25, 50, 818, 315, $LVS_SINGLESEL + $LVS_EX_DOUBLEBUFFER)
GUICtrlSetResizing(-1, $GUI_DOCKTOP + $GUI_DOCKLEFT + $GUI_DOCKRIGHT + $GUI_DOCKBOTTOM)
$Handle_LV_SYS[$Null] = GUICtrlGetHandle($LV_SYS[$Null])
GUICtrlSetFont(-1, 9, 150, '', 'Calibri')

$Icon = _GUIImageList_Create(16, 16, 5)
_GUICtrlListView_SetImageList($Handle_LV_SYS[$Null], $Icon, 1)

For $i = $Null To 6
	_GUICtrlListView_AddColumn($Handle_LV_SYS[$Null], $Bezeichnung_0[$i][$Null], $Bezeichnung_0[$i][1])
Next

$aWinList = StartCallback()
If @error Then ErrorExit()
$aProcess = New_Prozess(1, '', '')

If IsArray($aProcess) Then
	_GUICtrlListView_BeginUpdate($Handle_LV_SYS[$Null])
	For $i = 1 To $aWinList[0][0]
		$iIndex = IsInArray($aProcess, $aWinList[$i][3], 1, 0, 0, 0, 1)
		If Not @error And ($aProcess[$iIndex][1] <> $EigenPID) Then
			$Index = _GUIImageList_AddIcon($Icon, $aProcess[$iIndex][2])
			_GUICtrlListView_AddItem($Handle_LV_SYS[0], $aWinList[$i][1], $Index)
			_GUICtrlListView_AddSubItem($Handle_LV_SYS[$Null], $Index, $aProcess[$iIndex][$Null], 1)
			_GUICtrlListView_AddSubItem($Handle_LV_SYS[$Null], $Index, ' Wird ausgeführt ', 2)
			_GUICtrlListView_AddSubItem($Handle_LV_SYS[$Null], $Index, $aWinList[$i][3], 3)
			_GUICtrlListView_AddSubItem($Handle_LV_SYS[$Null], $Index, $aWinList[$i][$Null], 4)
			_GUICtrlListView_AddSubItem($Handle_LV_SYS[$Null], $Index, $aProcess[$iIndex][2], 5)
			_GUICtrlListView_AddSubItem($Handle_LV_SYS[$Null], $Index, $aWinList[$i][2], 6)
		EndIf
	Next
	_GUICtrlListView_EndUpdate($Handle_LV_SYS[$Null])
EndIf

$SYS[$Null] = GUICtrlCreateButton('Task beenden', 535, 375, 100, 22)
GUICtrlSetResizing(-1, $GUI_DOCKRIGHT + $GUI_DOCKWIDTH + $GUI_DOCKBOTTOM + $GUI_DOCKHEIGHT)
GUICtrlSetOnEvent(-1, 'Anw_Prog_P_S')
$SYS[1] = GUICtrlCreateButton('Wechseln zu', 640, 375, 100, 22)
GUICtrlSetResizing(-1, $GUI_DOCKRIGHT + $GUI_DOCKWIDTH + $GUI_DOCKBOTTOM + $GUI_DOCKHEIGHT)
GUICtrlSetOnEvent(-1, 'Anw_Prog_P_S')
$SYS[2] = GUICtrlCreateButton('Neuer Task...', 745, 375, 100, 22)
GUICtrlSetResizing(-1, $GUI_DOCKRIGHT + $GUI_DOCKWIDTH + $GUI_DOCKBOTTOM + $GUI_DOCKHEIGHT)
GUICtrlSetOnEvent(-1, 'Anw_Prog_P_S')

GUICtrlCreateTabItem('Processe')
$LV_SYS[1] = GUICtrlCreateListView('', 25, 50, 818, 315, $LVS_SINGLESEL + $LVS_EX_DOUBLEBUFFER)
GUICtrlSetResizing(-1, $GUI_DOCKTOP + $GUI_DOCKLEFT + $GUI_DOCKRIGHT + $GUI_DOCKBOTTOM)
$Handle_LV_SYS[1] = GUICtrlGetHandle($LV_SYS[1])
GUICtrlSetFont(-1, 9, 150, '', 'Calibri')

For $i = $Null To 7
	_GUICtrlListView_AddColumn($Handle_LV_SYS[1], $Bezeichnung_1[$i], 100)
Next

$aProcess_0 = New_Prozess(2, '', '')
If IsArray($aProcess_0) Then
	_GUICtrlListView_BeginUpdate($Handle_LV_SYS[1])
	_GUICtrlListView_AddArray($LV_SYS[1], $aProcess_0)
	_GUICtrlListView_EndUpdate($Handle_LV_SYS[1])
EndIf

$SYS[3] = GUICtrlCreateButton('Process beenden', 745, 375, 100, 22)
GUICtrlSetResizing(-1, $GUI_DOCKRIGHT + $GUI_DOCKWIDTH + $GUI_DOCKBOTTOM + $GUI_DOCKHEIGHT)
GUICtrlSetOnEvent(-1, 'Anw_Prog_P_S')

GUICtrlCreateTabItem('Dienste')
$LV_SYS[2] = GUICtrlCreateListView('', 25, 50, 818, 315, $LVS_SINGLESEL + $LVS_EX_DOUBLEBUFFER)
GUICtrlSetResizing(-1, $GUI_DOCKTOP + $GUI_DOCKLEFT + $GUI_DOCKRIGHT + $GUI_DOCKBOTTOM)
$Handle_LV_SYS[2] = GUICtrlGetHandle($LV_SYS[2])
GUICtrlSetFont(-1, 9, 150, '', 'Calibri')

For $i = $Null To 9
	_GUICtrlListView_AddColumn($Handle_LV_SYS[2], $Bezeichnung_2[$i], 100)
Next

$Dienste = LA_Services(@ComputerName)
If IsArray($Dienste) Then
	_GUICtrlListView_BeginUpdate($Handle_LV_SYS[2])
	_GUICtrlListView_AddArray($LV_SYS[2], $Dienste)
	_GUICtrlListView_EndUpdate($Handle_LV_SYS[2])
EndIf

GUICtrlCreateTabItem('')
$iStatus = _GUICtrlStatusBar_Create($Form[$Null])
_GUICtrlStatusBar_SetParts($iStatus, $iParts)

$Contextmenu[$Null] = GUICtrlCreateContextMenu($LV_SYS[$Null])
$Contextmenuitem_0[$Null] = GUICtrlCreateMenuItem('Task beenden', $Contextmenu[$Null])
GUICtrlSetOnEvent(-1, 'Anw_Prog_P_S')
$Contextmenuitem_0[1] = GUICtrlCreateMenuItem('Wechseln zu', $Contextmenu[$Null])
GUICtrlSetOnEvent(-1, 'Anw_Prog_P_S')
$Contextmenuitem_0[2] = GUICtrlCreateMenuItem('Neuer Task...', $Contextmenu[$Null])
GUICtrlSetOnEvent(-1, 'Anw_Prog_P_S')

$Contextmenu[1] = GUICtrlCreateContextMenu($LV_SYS[1])
$Contextmenuitem_1[$Null] = GUICtrlCreateMenuItem('Dateipfad öffnen', $Contextmenu[1])
GUICtrlSetOnEvent(-1, 'Anw_Prog_P_S')
$Contextmenuitem_1[1] = GUICtrlCreateMenuItem('Process beenden', $Contextmenu[1])
GUICtrlSetOnEvent(-1, 'Anw_Prog_P_S')
$Contextmenuitem_1[2] = GUICtrlCreateMenuItem('Priorität festlegen', $Contextmenu[1])
GUICtrlSetOnEvent(-1, 'Anw_Prog_P_S')

$Contextmenu[2] = GUICtrlCreateContextMenu($LV_SYS[2])
$Contextmenuitem_2[$Null] = GUICtrlCreateMenuItem('Dienst starten', $Contextmenu[2])
GUICtrlSetOnEvent(-1, 'Anw_Prog_P_S')
$Contextmenuitem_2[1] = GUICtrlCreateMenuItem('Dienst beenden', $Contextmenu[2])
GUICtrlSetOnEvent(-1, 'Anw_Prog_P_S')
GUISetState()

$Form[1] = GUICreate('Priorität Festlegen', 350, 180, -1, -1)
GUISetOnEvent(-3, 'Form_HIDE')
$Label = GUICtrlCreateLabel('', 15, 20, 320, 25, $SS_CENTER)
GUICtrlSetColor(-1, 0x0000FF)
GUICtrlCreateLabel('Das Ändern der Priorität bestimmter Prozesse kann zu einer Instabilität des System führen.', 15, 55, 320, 25, $SS_CENTER)
$Checkbox[$Null] = GUICtrlCreateButton('Niedrig', 40, 115, 60, 20)
GUICtrlSetOnEvent(-1, 'Anw_Prog_P_S')
$Checkbox[1] = GUICtrlCreateButton('Normal', 105, 115, 60, 20)
GUICtrlSetOnEvent(-1, 'Anw_Prog_P_S')
$Checkbox[2] = GUICtrlCreateButton('Hoch', 185, 115, 60, 20)
GUICtrlSetOnEvent(-1, 'Anw_Prog_P_S')
$Checkbox[3] = GUICtrlCreateButton('Echtzeit', 250, 115, 60, 20)
GUICtrlSetOnEvent(-1, 'Anw_Prog_P_S')
GUISetState(@SW_HIDE, $Form[1])

$Form[2] = GUICreate('Leistung', $laenge, 460, -1, -1, BitOR($WS_CAPTION, $WS_POPUP, $WS_SYSMENU), $WS_EX_TOPMOST)

For $i = $Null To UBound($aCPU) - 2
	If $i Then $Set_Prog = 70 * $i
	$core[$i] = GUICtrlCreateProgress(50 + $Set_Prog, 65, 60, 160, $PBS_VERTICAL)
	$P_core[$i] = GUICtrlCreateLabel('', 50 + $Set_Prog, 230, 50, 20, $SS_CENTER)
	$l_core[$i] = GUICtrlCreateLabel('CPU ' & $i + 1, 50 + $Set_Prog, 45, 50, 20, $SS_CENTER)
Next

Global $Arbeitspeicher = GUICtrlCreateProgress(50, 280, 80, 140, $PBS_VERTICAL)
Global $l_Arbeitspeicher = GUICtrlCreateLabel('Arbeitsspeicher', 40, 260, 100, 20, $SS_CENTER)
Global $P_Arbeitspeicher = GUICtrlCreateLabel('', 50, 425, 80, 20, $SS_CENTER)
GUICtrlCreateGroup('Physikalischer Speicher (MB)', 160, 300, 170, 110)
GUICtrlCreateLabel('Insgesamt : ', 180, 330, 60, 19)
Global $GesamtRAM = GUICtrlCreateInput('', 270, 330, 40, 19, $ES_READONLY + $ES_CENTER)
GUICtrlCreateLabel('Verfügbar : ', 180, 355, 60, 19)
Global $VerfuegbarerRAM = GUICtrlCreateInput('', 270, 355, 40, 19, $ES_READONLY + $ES_CENTER)
GUICtrlCreateLabel('Benutzt   : ', 180, 380, 60, 19)
Global $BenutztRAM = GUICtrlCreateInput('', 270, 380, 40, 19, $ES_READONLY + $ES_CENTER)
GUISetState(@SW_HIDE, $Form[2])

AdlibRegister('Update', 1000)
GUIRegisterMsg($WM_SIZE, 'WM_SIZE')
GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')
GUIRegisterMsg(0x0024, 'MY_WM_GETMINMAXINFO')

Func Update()
	Switch _GUICtrlTab_GetCurSel($Tab)
		Case $Null
			If WinListe_Update() Then _GUICtrlStatusBar_SetText($iStatus, ' Aktive Fenster : ' & _GUICtrlListView_GetItemCount($Handle_LV_SYS[$Null]), $Null)
		Case 1
			If Prozess_Update() Then _GUICtrlStatusBar_SetText($iStatus, ' Prozesse : ' & _GUICtrlListView_GetItemCount($Handle_LV_SYS[1]), $Null)
		Case 2
			_GUICtrlStatusBar_SetText($iStatus, ' Dienste : ' & _GUICtrlListView_GetItemCount($Handle_LV_SYS[2]), $Null)
	EndSwitch
EndFunc   ;==>Update

Func WinListe_Update()
	Local $Temp[1]
	Local $iWin = StartCallback()
	If @error Then ErrorExit()
	Local $GIC_Win_A_P = GetListViewToArray($Null)
	Local $WinAlt = $GIC_Win_A_P[$Null]
	Local $WinAltPrue = $GIC_Win_A_P[1]
	If ($iWin[$Null][$Null] = UBound($GIC_Win_A_P[$Null])) Then
		For $i = $Null To $iWin[$Null][$Null]
			If (Not IsInArray($WinAlt, $iWin[$i][1])) Then Win_Alt_Prue($WinAltPrue, $iWin[$i][$Null], $iWin[$i][1])
		Next
		Return True
	EndIf
	Local $iPro = New_Prozess(1, '', '')
	If IsArray($iPro) Then
		_GUIImageList_SetImageCount($Icon, _GUICtrlListView_GetItemCount($Handle_LV_SYS[$Null]))
		_GUICtrlListView_BeginUpdate($Handle_LV_SYS[$Null])
		For $i = $Null To $iWin[$Null][$Null]
			$iIndex = IsInArray($iPro, $iWin[$i][3], 1, $Null, $Null, $Null, 1)
			If Not @error And ($iPro[$iIndex][1] <> $EigenPID) Then
				_ArrayAdd($Temp, $iWin[$i][$Null])
				If (Not IsInArray($WinAlt, $iWin[$i][1]) And Not IsInArray($WinAltPrue, $iWin[$i][$Null])) And Not StringInStr($iPro[$iIndex][$Null], 'consent.exe', 1) Then
					If Win_Alt_Prue($WinAltPrue, $iWin[$i][$Null], $iWin[$i][1]) Then ContinueLoop
					$Index = _GUIImageList_AddIcon($Icon, $iPro[$iIndex][2])
					_GUICtrlListView_AddItem($Handle_LV_SYS[$Null], $iWin[$i][1], $Index)
					_GUICtrlListView_AddSubItem($Handle_LV_SYS[$Null], $Index, $iPro[$iIndex][$Null], 1)
					_GUICtrlListView_AddSubItem($Handle_LV_SYS[$Null], $Index, ' Wird ausgeführt ', 2)
					_GUICtrlListView_AddSubItem($Handle_LV_SYS[$Null], $Index, $iWin[$i][3], 3)
					_GUICtrlListView_AddSubItem($Handle_LV_SYS[$Null], $Index, $iWin[$i][$Null], 4)
					_GUICtrlListView_AddSubItem($Handle_LV_SYS[$Null], $Index, $iPro[$iIndex][2], 5)
					_GUICtrlListView_AddSubItem($Handle_LV_SYS[$Null], $Index, $iWin[$i][2], 6)
				EndIf
			EndIf
		Next
		_GUICtrlListView_EndUpdate($Handle_LV_SYS[$Null])
	EndIf
	If (UBound($Temp) - 2 < $WinAltPrue[$Null]) Then
		For $i = 1 To $WinAltPrue[$Null]
			If (Not IsInArray($Temp, $WinAltPrue[$i])) Then _GUICtrlListView_DeleteItem($Handle_LV_SYS[0], (IsInArray($WinAltPrue, $WinAltPrue[$i], $Null, $Null, $Null, $Null, 1) - 1))
		Next
	EndIf
	Return True
EndFunc   ;==>WinListe_Update

Func Win_Alt_Prue($WAP, $HWL, $F_Text)
	For $i = 1 To $WAP[$Null]
		If ($WAP[$i] = $HWL) Then
			If _GUICtrlListView_SetItemText($Handle_LV_SYS[$Null], ($i - 1), $F_Text) Then Return True
		EndIf
	Next
	Return False
EndFunc   ;==>Win_Alt_Prue

Func Prozess_Update()
	Local $Pro_New, $Temp[1]
	Local $Pro_New_List = ProcessList()
	Local $Pro_Alt = GetListViewToArray(1)
	If (UBound($Pro_Alt) - 1 = UBound($Pro_New_List) - 2) Then Return True
	_GUICtrlListView_BeginUpdate($Handle_LV_SYS[1])
	For $i = 2 To $Pro_New_List[$Null][$Null]
		If Not IsInArray($Pro_Alt, $Pro_New_List[$i][$Null]) Then
			$Pro_New = New_Prozess($Null, $Pro_New_List[$i][1], $Error)
			_GUICtrlListView_AddItem($Handle_LV_SYS[1], $Pro_New[$Null][$Null], _GUICtrlListView_GetItemCount($Handle_LV_SYS[1]))
			For $e = 1 To UBound($Pro_New, 2) - 1
				_GUICtrlListView_AddSubItem($Handle_LV_SYS[1], _GUICtrlListView_GetItemCount($Handle_LV_SYS[1]) - 1, $Pro_New[$Null][$e], $e)
			Next
		EndIf
		_ArrayAdd($Temp, $Pro_New_List[$i][$Null])
	Next
	For $i = 1 To $Pro_Alt[$Null]
		If Not IsInArray($Temp, $Pro_Alt[$i]) Then _GUICtrlListView_DeleteItem($Handle_LV_SYS[1], (IsInArray($Pro_Alt, $Pro_Alt[$i], $Null, $Null, $Null, $Null, 1) - 1))
	Next
	Return _GUICtrlListView_EndUpdate($Handle_LV_SYS[1])
EndFunc   ;==>Prozess_Update

Func GetListViewToArray($HWnd)
	Local $UB = _GUICtrlListView_GetItemCount($Handle_LV_SYS[$HWnd])
	Local $GCount[$UB + 1]
	Local $GCount_H[$UB + 1]
	$GCount[$Null] = $UB
	$GCount_H[$Null] = $UB
	For $i = 1 To $GCount[$Null]
		If Not $HWnd Then $GCount_H[$i] = _GUICtrlListView_GetItemText($Handle_LV_SYS[$HWnd], ($i - 1), 4)
		$GCount[$i] = _GUICtrlListView_GetItemText($Handle_LV_SYS[$HWnd], ($i - 1))
	Next
	If Not $HWnd Then
		Local $GCount_GCount_H[2]
		$GCount_GCount_H[$Null] = $GCount
		$GCount_GCount_H[1] = $GCount_H
		Return $GCount_GCount_H
	Else
		Return $GCount
	EndIf
EndFunc   ;==>GetListViewToArray

Func Anw_Prog_P_S()
	Switch _GUICtrlTab_GetCurSel($Tab)
		Case $Null
			$iGetIthm = _GUICtrlListView_GetSelectionMark($Handle_LV_SYS[$Null])
			Switch @GUI_CtrlId
				Case $SYS[0], $Contextmenuitem_0[0]
					If ($iGetIthm > -1) Then
						If Not WinClose(_GUICtrlListView_GetItemText($Handle_LV_SYS[$Null], $iGetIthm)) Then
							If (MsgBox(4, 'Die Anwendung konnte nicht geschlossen werden!', 'Zwingen das Fenster zu schließen?') = 6) Then WinKill(_GUICtrlListView_GetItemText($Handle_LV_SYS[$Null], $iGetIthm))
						EndIf
					EndIf
				Case $SYS[1], $Contextmenuitem_0[1]
					If ($iGetIthm > -1) Then WinActivate(_GUICtrlListView_GetItemText($Handle_LV_SYS[$Null], $iGetIthm), '')
				Case $SYS[2], $MenuItem_0, $Contextmenuitem_0[2]
					Local $New_Task = FileOpenDialog('Durchsuchen', @DesktopDir, 'Alle (*.*)', 1 + 2, '', $Form[$Null])
					If @error Then Return False
					ShellExecute($New_Task)
			EndSwitch
		Case 1
			$iGetIthm = _GUICtrlListView_GetSelectionMark($Handle_LV_SYS[1])
			Switch @GUI_CtrlId
				Case $SYS[3], $Contextmenuitem_1[1]
					If ($iGetIthm > -1) Then
						Local $Text = 'Möchten sie "' & _GUICtrlListView_GetItemText($Handle_LV_SYS[1], $iGetIthm) & '" Beenden?' & @CRLF & @CRLF & _
								'Wenn sie ein geöffnetes Programm diesem Prozess zugeordnet ist, ' & _
								'wird es geschlossen und alle nicht gespeicherten Daten gehen Verloren ' & _
								'Wenn sie ein Systemprozess beenden, kann dieses dazu führen, dass das ' & _
								'System instabil wird. Möchten sie den Vorgang fortsetzen?'
						Local $PID = ProcessExists(_GUICtrlListView_GetItemText($Handle_LV_SYS[1], $iGetIthm))
						If Not $PID Then Return MsgBox(4112, 'Fehler', 'Der Process Existiert nicht!')
						If (MsgBox(4, 'Process_Beenden', $Text) = 6) Then
							ProcessClose($PID)
							Switch @error
								Case 1
									MsgBox(4112, 'Fehler', 'OpenProcess fehlgeschlagen!')
								Case 2
									MsgBox(4112, 'Fehler', 'AdjustTokenPrivileges fehlgeschlagen!')
								Case 3
									MsgBox(4112, 'Fehler', 'TerminateProcess fehlgeschlagen!')
								Case 4
									MsgBox(4112, 'Fehler', 'Es konnte nicht sichergestellt werden, ob der Prozess existiert!')
							EndSwitch
						EndIf
					EndIf
				Case $Contextmenuitem_1[$Null]
					If ($iGetIthm > -1) Then ShellExecute(StringTrimRight(_GUICtrlListView_GetItemText($Handle_LV_SYS[1], $iGetIthm, 5), StringLen(_GUICtrlListView_GetItemText($Handle_LV_SYS[1], $iGetIthm)) + 1))
				Case $Contextmenuitem_1[2]
					If ($iGetIthm > -1) Then
						If _WinSetTrans($Null) Then $Set_Label = _GUICtrlListView_GetItemText($Handle_LV_SYS[1], $iGetIthm)
						GUICtrlSetData($Label, 'Möchten sie die Priorität von "' & $Set_Label & '" ändern?')
						GUISetState(@SW_SHOW, $Form[1])
					EndIf
				Case $Checkbox[$Null], $Checkbox[1], $Checkbox[2], $Checkbox[3]
					Local $Set
					Switch GUICtrlRead(@GUI_CtrlId, 1)
						Case 'Niedrig'
							$Set = $Null
						Case 'Normal'
							$Set = 2
						Case 'Hoch'
							$Set = 4
						Case 'Echtzeit'; nicht bei Win7
							$Set = 5
					EndSwitch
					ProcessSetPriority($Set_Label, $Set)
					GUISetState(@SW_HIDE, $Form[1])
			EndSwitch
		Case 2
			Local $ErrHaw
			$iGetIthm = _GUICtrlListView_GetSelectionMark($Handle_LV_SYS[2])
			Switch @GUI_CtrlId
				Case $Contextmenuitem_2[$Null]
					If ($iGetIthm > -1) Then
						$ErrHaw = _Services_Running(_GUICtrlListView_GetItemText($Handle_LV_SYS[2], $iGetIthm))
						If ($ErrHaw = 'Erfolg') Then _GUICtrlListView_SetItemText($Handle_LV_SYS[2], $iGetIthm, ' Wird ausgeführt ', 5)
					EndIf
					MsgBox(64, ' Dienst - Start ', $ErrHaw)
				Case $Contextmenuitem_2[1]
					If ($iGetIthm > -1) Then
						$ErrHaw = _Services_Stopp(_GUICtrlListView_GetItemText($Handle_LV_SYS[2], $iGetIthm))
						If ($ErrHaw = 'Erfolg') Then _GUICtrlListView_SetItemText($Handle_LV_SYS[2], $iGetIthm, ' Beendet ', 5)
					EndIf
					MsgBox(64, 'Dienst - Stopp', $ErrHaw)
			EndSwitch
	EndSwitch
EndFunc   ;==>Anw_Prog_P_S

Func _CPU_Darstellung()
	If _WinSetTrans($Null) And GUISetState(@SW_SHOW, $Form[2]) Then Local $iTimer = TimerInit()
	Local $iOnEventMode = Opt('GUIOnEventMode', $Null)
	Do
		If (Round(TimerDiff($iTimer)) > 875) Then
			$mem = MemGetStats()
			$aCPU = Refresh()
			For $i = $Null To UBound($aCPU) - 2
				GUICtrlSetData($core[$i], $aCPU[$i])
				GUICtrlSetData($P_core[$i], $aCPU[$i] & '%')
			Next
			GUICtrlSetData($GesamtRAM, Round($mem[1] / 1024))
			GUICtrlSetData($VerfuegbarerRAM, Round($mem[2] / 1024))
			GUICtrlSetData($BenutztRAM, Round(($mem[1] - $mem[2]) / 1024))
			GUICtrlSetData($Arbeitspeicher, Round(($mem[1] - $mem[2]) * 100 / $mem[1]))
			GUICtrlSetData($P_Arbeitspeicher, Round(($mem[1] - $mem[2]) / 1024) & ' MB')
			_GUICtrlStatusBar_SetText($iStatus, StringFormat('%02d:%02d:%02d', @HOUR, @MIN, @SEC), 2)
			_GUICtrlStatusBar_SetText($iStatus, 'CPU-Auslastung: ' & $aCPU[UBound($aCPU) - 1] & ' % ' & '             Physikalischer Speicher: ' & $mem[0] & '%', 1)
			$iTimer = TimerInit()
		EndIf
	Until GUIGetMsg() = $GUI_EVENT_CLOSE
	If GUISetState(@SW_HIDE, $Form[2]) And _WinSetTrans(1) Then Opt('GUIOnEventMode', $iOnEventMode)
EndFunc   ;==>_CPU_Darstellung

Func LV_Sort($HWnd, $iSubItem)
	Local $Split
	Local $1D = _GUICtrlListView_GetItemCount($HWnd) - 1
	Local $2D = _GUICtrlListView_GetColumnCount($HWnd) - 1
	Local $Sort_Array[$1D + 1]
	For $i = $Null To $1D
		$Sort_Array[$i] = _GUICtrlListView_GetItemText($HWnd, $i, $iSubItem) & '|' & $i
	Next
	QuickSort($Sort_Array, $Null, $1D)
	Local $Set_Array[$1D + 1][$2D + 1]
	For $i = $Null To $1D
		$Split = StringMid($Sort_Array[$i], StringInStr($Sort_Array[$i], '|', $Null, -1) + 1, StringLen($Sort_Array[$i]))
		For $e = $Null To $2D
			$Set_Array[$i][$e] = _GUICtrlListView_GetItemText($HWnd, $Split, $e)
		Next
	Next
	_ObjektAr2DDubDel($Set_Array)
	If _GUICtrlListView_DeleteAllItems($HWnd) Then
		Switch $HWnd
			Case $Handle_LV_SYS[$Null]
				If _GUIImageList_SetImageCount($Icon, _GUICtrlListView_GetItemCount($HWnd)) Then _GUICtrlListView_BeginUpdate($HWnd)
				For $i = $Null To $1D
					$Index = _GUIImageList_AddIcon($Icon, $Set_Array[$i][5])
					_GUICtrlListView_AddItem($HWnd, $Set_Array[$i][$Null], $Index)
					For $e = $Null To $2D
						_GUICtrlListView_AddSubItem($HWnd, $Index, $Set_Array[$i][$e], $e)
					Next
				Next
				_GUICtrlListView_EndUpdate($HWnd)
			Case Else
				If _GUICtrlListView_BeginUpdate($HWnd) Then _GUICtrlListView_AddArray($HWnd, $Set_Array)
				_GUICtrlListView_EndUpdate($HWnd)
		EndSwitch
	EndIf
	Return True
EndFunc   ;==>LV_Sort

Func _WinSetTrans($Flag)
	Switch $Flag
		Case $Null
			For $i = 255 To 100 Step -$Trans
				WinSetTrans($Form[0], '', $i)
			Next
		Case 1
			For $i = 100 To 255 Step +$Trans
				WinSetTrans($Form[0], '', $i)
			Next
	EndSwitch
	Return True
EndFunc   ;==>_WinSetTrans

Func Refresh()
	$objRefresher.Refresh(0)
	If IsObj($objRefreshableItem) Then
		$i = $Null
		For $objItem In $objRefreshableItem.ObjectSet
			$aCPU[$i] = $objItem.PercentProcessorTime
			$i += 1
		Next
	EndIf
	Return $aCPU
EndFunc   ;==>Refresh

Func ErrorExit()
	MsgBox(4112, 'Error', 'Anfrage ist Fehlgeschlagen Programm wird Beemdet!', 5)
	Exit
EndFunc   ;==>ErrorExit

Func Ende()
	If _WinSetTrans($Null) Then Exit
EndFunc   ;==>Ende

Func Form_HIDE()
	If GUISetState(@SW_HIDE, @GUI_WinHandle) Then _WinSetTrans(1)
EndFunc   ;==>Form_HIDE

While 1 * Sleep(875)
	$mem = MemGetStats()
	$aCPU = Refresh()
	_GUICtrlStatusBar_SetText($iStatus, 'CPU-Auslastung: ' & $aCPU[UBound($aCPU) - 1] & ' % ' & '             Physikalischer Speicher: ' & $mem[0] & '%', 1)
	_GUICtrlStatusBar_SetText($iStatus, StringFormat('%02d:%02d:%02d', @HOUR, @MIN, @SEC), 2)
WEnd

Func MY_WM_GETMINMAXINFO($HWnd, $msg, $wParam, $lParam)
	#forceref $HWnd, $msg, $wParam
	Local $Info_Chek = DllStructCreate('int;int;int;int;int;int;int;int;int;int', $lParam)
	DllStructSetData($Info_Chek, 7, $Breite_K)
	DllStructSetData($Info_Chek, 8, $Hoehe_K)
	DllStructSetData($Info_Chek, 9, $Breite)
	Return DllStructSetData($Info_Chek, 10, $Hoehe)
EndFunc   ;==>MY_WM_GETMINMAXINFO

Func WM_SIZE($HWnd, $iMsg, $iwParam, $ilParam)
	#forceref $HWnd, $iMsg, $iwParam, $ilParam
	Local $aWinPos = WinGetPos($Form[$Null])
	Local $aParts[3] = [150, ($aWinPos[2] - 100), 50]
	_GUICtrlStatusBar_SetParts($iStatus, $aParts)
	_GUICtrlStatusBar_Resize($iStatus)
EndFunc   ;==>WM_SIZE

Func WM_NOTIFY($HWnd, $iMsg, $iwParam, $ilParam)
	#forceref $HWnd, $iMsg, $iwParam
	Local $hWndFrom, $iCode, $tNMHDR
	$tNMHDR = DllStructCreate($tagNMHDR_0, $ilParam)
	$hWndFrom = HWnd(DllStructGetData($tNMHDR, 'hWndFrom'))
	$iCode = DllStructGetData($tNMHDR, 'Code')
	Switch $hWndFrom
		Case $Handle_LV_SYS[0], $Handle_LV_SYS[1], $Handle_LV_SYS[2]
			Switch $iCode
				Case $LVN_COLUMNCLICK
					AdlibUnRegister('Update')
					If LV_Sort($hWndFrom, DllStructGetData(DllStructCreate($tagNMLISTVIEW_0, $ilParam), 'SubItem')) Then AdlibRegister('Update', 1000)
			EndSwitch
	EndSwitch
	Return $__LISTVIEWCONSTANT_GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY