Hey Leute!
Ich bastel gerade an eine Task – Manager ( Ideen von Raupi übernommen ) ich scheitere an der ImageListe.
Das Problem liegt darin, wenn ein Fenster sein Titel – Text, jede Sekunde verändert. Zum Beispiel irgendein Online Spiel läuft : Sekunde werden runter oder hoch gezählt und ich öffne ein „Fenster“ oder Programm das zur Liste hinzugefügt wird, im ersten Moment wird das richtige Icon geholt, beim Aktualisieren bekommt das Item das Icon zugewissen, welches vorher an der Stelle war.
Ich habe schon unzählige Möglichkeiten ausprobiert das, ich sie nicht alle aufzählen könnte und als ich dachte das, ich am Ziel war: Pustekuchen - irgendein anderer Fehler.
Nun raucht mir der Kopf, habe keine Ideen mehr Hilfe hoch und runter gelesen, nur irgendwie sehe ich den Wald vor lauter Bäume nicht mehr.
code:
Spoiler anzeigen
;#RequireAdmin
[/autoit] [autoit][/autoit] [autoit]#include <Array.au3>
#include <GuiImageList.au3>
#include <GuiListView.au3>
#include <GuiStatusBar.au3>
#include <GuiTab.au3>
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>
#include <Process.au3>
#include <WinAPI.au3>
#include <Process_new.au3>
[/autoit] [autoit][/autoit] [autoit]Opt('GUIOnEventMode', 1)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Global $Form[1]
Local $Tab
Local $SYS[30]
Local $Menue_SYS[5]
Local $aWinList, $Icon
Local $iParts[3] = [180, 780, 50], $iStatus, $ExecutablePath
Local $LV_SYS[5], $Handle_LV_SYS[5], $LV_Array_Pro[8]
Local $Com_Fehler = ObjEvent('AutoIt.Error', 'Com_Fehler'), $Error = True, $Us, $sU, $co
Local $obWMI = ObjGet('winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2'), $cI
Local $exStyles = BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES)
Local $Bezeichnung[8] = ['ProzesseName ', ' PID', 'Parent PID', 'Eigentümer', 'Priorität', 'Ausführbaren Pfad', 'Geschriebenen Daten', 'Speichernutzung']
$Form[0] = GUICreate('Task_Manager', 870, 550, (@DesktopWidth - 870) / 2, (@DesktopHeight - 550) / 2, $WS_OVERLAPPEDWINDOW + $WS_CLIPSIBLINGS)
GUISetOnEvent(-3, 'Ende')
GUICtrlCreateLabel('Task - Überblick', 400, 480, 200, 20)
GUICtrlSetFont(-1, 14, 400, '', 'Arial')
$Menue_SYS[0] = GUICtrlCreateMenu('Datein')
$Tab = GUICtrlCreateTab(10, 8, 850, 400)
GUICtrlSetResizing(-1, $GUI_DOCKTOP + $GUI_DOCKLEFT + $GUI_DOCKBOTTOM + $GUI_DOCKRIGHT)
GUICtrlCreateTabItem('Anwendungen')
$LV_SYS[0] = GUICtrlCreateListView('', 25, 50, 818, 315, 0x00010000)
GUICtrlSetResizing(-1, $GUI_DOCKTOP + $GUI_DOCKLEFT + $GUI_DOCKRIGHT + $GUI_DOCKBOTTOM)
$Handle_LV_SYS[0] = GUICtrlGetHandle($LV_SYS[0])
$Icon = _GUIImageList_Create(16, 16, 5)
_GUICtrlListView_SetImageList($Handle_LV_SYS[0], $Icon, 1)
_GUICtrlListView_AddColumn($LV_SYS[0], 'Task', 260)
_GUICtrlListView_AddColumn($LV_SYS[0], 'EXE', 60)
_GUICtrlListView_AddColumn($LV_SYS[0], 'Status', 60)
_GUICtrlListView_AddColumn($LV_SYS[0], 'PID', 40)
_GUICtrlListView_AddColumn($LV_SYS[0], 'Handel', 100)
_GUICtrlListView_AddColumn($LV_SYS[0], 'Pfad', 260)
$aProcess = ProcessList()
$ExecutablePath = ExecutablePath()
$aWinList = _WinAPI_EnumWindowsTop()
For $i = 1 To UBound($aProcess) - 1
For $e = 1 To $aWinList[0][0]
If (WinGetProcess($aWinList[$e][0]) = $aProcess[$i][1]) Then
If WinGetTitle($aWinList[$e][0]) <> '' Then
_GUICtrlListView_AddItem($Handle_LV_SYS[0], WinGetTitle($aWinList[$e][0]), _GUICtrlListView_GetItemCount($Handle_LV_SYS[0]))
_GUICtrlListView_AddSubItem($Handle_LV_SYS[0], _GUICtrlListView_GetItemCount($Handle_LV_SYS[0]) - 1, $aProcess[$i][0], 1)
_GUICtrlListView_AddSubItem($Handle_LV_SYS[0], _GUICtrlListView_GetItemCount($Handle_LV_SYS[0]) - 1, ' Wird ausgeführt ', 2)
_GUICtrlListView_AddSubItem($Handle_LV_SYS[0], _GUICtrlListView_GetItemCount($Handle_LV_SYS[0]) - 1, WinGetProcess($aWinList[$e][0]), 3)
_GUICtrlListView_AddSubItem($Handle_LV_SYS[0], _GUICtrlListView_GetItemCount($Handle_LV_SYS[0]) - 1, $aWinList[$e][0], 4)
_GUICtrlListView_AddSubItem($Handle_LV_SYS[0], _GUICtrlListView_GetItemCount($Handle_LV_SYS[0]) - 1, $ExecutablePath[$i], 5)
_GUIImageList_AddIcon($Icon, $ExecutablePath[$i])
EndIf
EndIf
Next
Next
$SYS[0] = GUICtrlCreateButton('Task beenden', 535, 375, 100, 22)
GUICtrlSetResizing(-1, $GUI_DOCKRIGHT + $GUI_DOCKWIDTH + $GUI_DOCKBOTTOM + $GUI_DOCKHEIGHT)
GUICtrlSetOnEvent(-1, 'Prozess_Update')
$SYS[1] = GUICtrlCreateButton('Wechseln zu', 640, 375, 100, 22)
GUICtrlSetResizing(-1, $GUI_DOCKRIGHT + $GUI_DOCKWIDTH + $GUI_DOCKBOTTOM + $GUI_DOCKHEIGHT)
GUICtrlSetOnEvent(-1, '')
$SYS[2] = GUICtrlCreateButton('Neuer Task...', 745, 375, 100, 22)
GUICtrlSetResizing(-1, $GUI_DOCKRIGHT + $GUI_DOCKWIDTH + $GUI_DOCKBOTTOM + $GUI_DOCKHEIGHT)
GUICtrlSetOnEvent(-1, '')
GUICtrlCreateTabItem('Processe')
$LV_SYS[1] = GUICtrlCreateListView('', 25, 50, 818, 315, 0x00010000)
GUICtrlSetResizing(-1, $GUI_DOCKTOP + $GUI_DOCKLEFT + $GUI_DOCKRIGHT + $GUI_DOCKBOTTOM)
$Handle_LV_SYS[1] = GUICtrlGetHandle($LV_SYS[1])
For $i = 0 To 7
$LV_Array_Pro[$i] = _GUICtrlListView_AddColumn($Handle_LV_SYS[1], $Bezeichnung[$i], 100)
Next
$co = $obWMI.ExecQuery('SELECT * FROM Win32_Process')
If Not IsObj($co) Then
MsgBox(0, 'Error', 'Fehler, Objekt konnte nicht erstellt werden' & @CRLF & 'Programm wird beendet!')
Exit
EndIf
Dim $Prozess[$co.Count - 1][8], $i = 0
For $ob In $co
If $i >= 1 Then
$Prozess[$i - 1][0] = $ob.Caption
$Prozess[$i - 1][1] = $ob.ProcessId
$Prozess[$i - 1][2] = $ob.ParentProcessId
If ($Error = True) Then
If $ob.GetOwner($sU, $Us) = 0 Then $Prozess[$i - 1][3] = $sU & '\' & $Us
EndIf
$Prozess[$i - 1][4] = $ob.Priority
$Prozess[$i - 1][5] = $ob.ExecutablePath
$Prozess[$i - 1][6] = $ob.WriteTransferCount
$Prozess[$i - 1][7] = $ob.WorkingSetSize
EndIf
$i += 1
Next
_GUICtrlListView_AddArray($LV_SYS[1], $Prozess)
$SYS[3] = GUICtrlCreateButton('Process beenden', 745, 375, 100, 22)
GUICtrlSetResizing(-1, $GUI_DOCKRIGHT + $GUI_DOCKWIDTH + $GUI_DOCKBOTTOM + $GUI_DOCKHEIGHT)
GUICtrlSetOnEvent(-1, '')
GUICtrlCreateTabItem('')
$SYS[3] = GUICtrlCreateLabel('', 700, 490, 170, 22)
GUICtrlSetResizing(-1, $GUI_DOCKRIGHT + $GUI_DOCKWIDTH + $GUI_DOCKBOTTOM + $GUI_DOCKHEIGHT)
GUICtrlSetFont(-1, 8.5, 1000, '', 'Arial')
$SYS[4] = GUICtrlCreateLabel('', 700, 465, 140, 22)
GUICtrlSetResizing(-1, $GUI_DOCKRIGHT + $GUI_DOCKWIDTH + $GUI_DOCKBOTTOM + $GUI_DOCKHEIGHT)
GUICtrlSetFont(-1, 8.5, 1000, '', 'Arial')
$iStatus = _GUICtrlStatusBar_Create($Form[0])
_GUICtrlStatusBar_SetParts($iStatus, $iParts)
GUISetState()
AdlibRegister('Update', 1000)
GUIRegisterMsg($WM_SIZE, 'WM_SIZE')
GUIRegisterMsg(0x0024, 'MY_WM_GETMINMAXINFO')
Func Update()
Switch _GUICtrlTab_GetCurSel($Tab)
Case 0
WinListe_Update()
_GUICtrlStatusBar_SetText($iStatus, ' Aktive Fenster : ' & _GUICtrlListView_GetItemCount($Handle_LV_SYS[0]), 0)
Case 1
Prozess_Update()
_GUICtrlStatusBar_SetText($iStatus, ' Prozesse : ' & _GUICtrlListView_GetItemCount($Handle_LV_SYS[1]), 0)
EndSwitch
EndFunc ;==>Update
Func WinListe_Update()
Local $Temp[1], $F_Text
Local $UB = _GUICtrlListView_GetItemCount($Handle_LV_SYS[0])
Local $Win_Alt[$UB + 1]
$Win_Alt[0] = $UB
For $i = 1 To $Win_Alt[0]
$Win_Alt[$i] = _GUICtrlListView_GetItemText($Handle_LV_SYS[0], $i - 1, 0)
Next
Local $iProcess = ProcessList()
Local $ExecutablePath = ExecutablePath()
Local $iWinList = _WinAPI_EnumWindowsTop()
_GUICtrlListView_BeginUpdate($Handle_LV_SYS[0])
For $i = 2 To $iProcess[0][0]
For $e = 1 To $iWinList[0][0]
If (WinGetProcess($iWinList[$e][0]) = $iProcess[$i][1]) Then
$F_Text = WinGetTitle($iWinList[$e][0])
If ($F_Text <> '') Then
If BitAND(_ArraySearch($Win_Alt, $F_Text), @error) Then
_GUIImageList_AddIcon($Icon, $ExecutablePath[$i])
_GUICtrlListView_AddItem($Handle_LV_SYS[0], $F_Text, _GUICtrlListView_GetItemCount($Handle_LV_SYS[0]))
_GUICtrlListView_AddSubItem($Handle_LV_SYS[0], _GUICtrlListView_GetItemCount($Handle_LV_SYS[0]) - 1, $iProcess[$i][0], 1)
_GUICtrlListView_AddSubItem($Handle_LV_SYS[0], _GUICtrlListView_GetItemCount($Handle_LV_SYS[0]) - 1, ' Wird ausgeführt ', 2)
_GUICtrlListView_AddSubItem($Handle_LV_SYS[0], _GUICtrlListView_GetItemCount($Handle_LV_SYS[0]) - 1, WinGetProcess($iWinList[$e][0]), 3)
_GUICtrlListView_AddSubItem($Handle_LV_SYS[0], _GUICtrlListView_GetItemCount($Handle_LV_SYS[0]) - 1, $iWinList[$e][0], 4)
_GUICtrlListView_AddSubItem($Handle_LV_SYS[0], _GUICtrlListView_GetItemCount($Handle_LV_SYS[0]) - 1, $ExecutablePath[$i], 5)
EndIf
_ArrayAdd($Temp, $F_Text)
EndIf
EndIf
Next
Next
$Temp[0] = UBound($Temp) - 1
For $i = 1 To $Win_Alt[0]
If BitAND(_ArraySearch($Temp, $Win_Alt[$i]), @error) Then _GUICtrlListView_DeleteItem($Handle_LV_SYS[0], _ArraySearch($Win_Alt, $Win_Alt[$i]) - 1)
Next
_GUICtrlListView_EndUpdate($Handle_LV_SYS[0])
If $Temp[0] >= $Win_Alt[0] Then _GUIImageList_SetImageCount($Icon, _GUICtrlListView_GetItemCount($Handle_LV_SYS[0]))
EndFunc ;==>WinListe_Update
Func Prozess_Update()
Local $Pro_New, $Temp[1]
Local $UB = _GUICtrlListView_GetItemCount($Handle_LV_SYS[1])
Local $Pro_New_List = ProcessList()
If ($UB = UBound($Pro_New_List) - 2) Then Return (0)
Local $Pro_Alt[$UB + 1]
$Pro_Alt[0] = $UB
For $i = 1 To $UB
$Pro_Alt[$i] = _GUICtrlListView_GetItemText($Handle_LV_SYS[1], $i - 1, 0)
Next
_GUICtrlListView_BeginUpdate($Handle_LV_SYS[1])
For $i = 2 To $Pro_New_List[0][0]
If BitAND(_ArraySearch($Pro_Alt, $Pro_New_List[$i][0]), @error) Then
$Pro_New = New_Prozess($Pro_New_List[$i][1], $Error)
_GUICtrlListView_AddItem($Handle_LV_SYS[1], $Pro_New[0][0], _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[0][$e], $e)
Next
EndIf
_ArrayAdd($Temp, $Pro_New_List[$i][0])
Next
$Temp[0] = UBound($Temp) - 1
For $i = 1 To $Pro_Alt[0]
If BitAND(_ArraySearch($Temp, $Pro_Alt[$i]), @error) Then _GUICtrlListView_DeleteItem($Handle_LV_SYS[1], _ArraySearch($Pro_Alt, $Pro_Alt[$i]) - 1)
Next
_GUICtrlListView_EndUpdate($Handle_LV_SYS[1])
EndFunc ;==>Prozess_Update
Func Com_Fehler()
Switch $Com_Fehler
Case 0
$Error = False
Case Else
$Error = True
EndSwitch
EndFunc ;==>Com_Fehler
Func WM_SIZE($hWnd, $iMsg, $iwParam, $ilParam)
Local $aWinPos = WinGetPos($Form[0])
Local $aParts[3] = [150, $aWinPos[2] - 100, 50]
_GUICtrlStatusBar_SetParts($iStatus, $aParts)
_GUICtrlStatusBar_Resize($iStatus)
EndFunc ;==>WM_SIZE
Func MY_WM_GETMINMAXINFO($hWnd, $Msg, $wParam, $lParam)
Local $Info_Chek = DllStructCreate('int;int;int;int;int;int;int;int;int;int', $lParam)
DllStructSetData($Info_Chek, 7, 410)
DllStructSetData($Info_Chek, 8, 455)
DllStructSetData($Info_Chek, 9, @DesktopWidth)
DllStructSetData($Info_Chek, 10, @DesktopHeight)
Return (0)
EndFunc ;==>MY_WM_GETMINMAXINFO
Func Ende()
Exit
EndFunc ;==>Ende
;Func Form_HIDE()
; GUISetState(@SW_HIDE, @GUI_WinHandle)
;EndFunc ;==>Form_HIDE
;Func Form_SHOW()
; GUISetState(@SW_SHOW, @GUI_WinHandle)
;EndFunc ;==>Form_SHOW
While 1 * Sleep(100)
_GUICtrlStatusBar_SetText($iStatus, StringFormat("%02d:%02d:%02d", @HOUR, @MIN, @SEC), 2)
WinSetTitle($Form[0], '',StringFormat("%02d:%02d:%02d", @HOUR, @MIN, @SEC))
WEnd
#include <Process_new.au3>
Spoiler anzeigen
#include-once
[/autoit] [autoit][/autoit] [autoit]Local $obWMI = ObjGet('winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2')
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Func New_Prozess($Process_New, $Error)
Local $Us, $sU
Local $Prozess[1][8]
Local $co = $obWMI.ExecQuery('SELECT * FROM Win32_Process')
For $ob In $co
If ($ob.ProcessId = $Process_New) Then
$Prozess[0][0] = $ob.Caption
$Prozess[0][1] = $ob.ProcessId
$Prozess[0][2] = $ob.ParentProcessId
If ($Error = True) Then
If $ob.GetOwner($sU, $Us) = 0 Then $Prozess[0][3] = $sU & '\' & $Us
EndIf
$Prozess[0][4] = $ob.Priority
$Prozess[0][5] = $ob.ExecutablePath
$Prozess[0][6] = $ob.WriteTransferCount
$Prozess[0][7] = $ob.WorkingSetSize
EndIf
Next
Return $Prozess
EndFunc ;==>New_Prozess
Func ExecutablePath()
Local $Us, $sU
Local $ExecutablePath
Local $co = $obWMI.ExecQuery('SELECT * FROM Win32_Process')
For $ob In $co
$ExecutablePath &= '|' & $ob.ExecutablePath
Next
Return StringSplit(StringTrimLeft($ExecutablePath, 1), '|')
EndFunc ;==>ExecutablePath
Im code habe ich die Aktuelle zeit im Titel laufen für Test´s!!
LG Kleiner