GUICtrlListView Icon ????

  • 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
    [autoit]

    ;#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>

    [/autoit] [autoit][/autoit] [autoit]

    #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']

    [/autoit] [autoit][/autoit] [autoit]

    $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)

    [/autoit] [autoit][/autoit] [autoit]

    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, '')

    [/autoit] [autoit][/autoit] [autoit]

    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, '')

    [/autoit] [autoit][/autoit] [autoit]

    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')

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $iStatus = _GUICtrlStatusBar_Create($Form[0])
    _GUICtrlStatusBar_SetParts($iStatus, $iParts)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    AdlibRegister('Update', 1000)
    GUIRegisterMsg($WM_SIZE, 'WM_SIZE')
    GUIRegisterMsg(0x0024, 'MY_WM_GETMINMAXINFO')

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    Func Com_Fehler()
    Switch $Com_Fehler
    Case 0
    $Error = False
    Case Else
    $Error = True
    EndSwitch
    EndFunc ;==>Com_Fehler

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    Func Ende()
    Exit
    EndFunc ;==>Ende

    [/autoit] [autoit][/autoit] [autoit]

    ;Func Form_HIDE()
    ; GUISetState(@SW_HIDE, @GUI_WinHandle)
    ;EndFunc ;==>Form_HIDE

    [/autoit] [autoit][/autoit] [autoit]

    ;Func Form_SHOW()
    ; GUISetState(@SW_SHOW, @GUI_WinHandle)
    ;EndFunc ;==>Form_SHOW

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit]

    #include <Process_new.au3>

    Spoiler anzeigen
    [autoit]

    #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

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit]

    Im code habe ich die Aktuelle zeit im Titel laufen für Test´s!!


    LG Kleiner

    Einmal editiert, zuletzt von kleiner27 (2. Juli 2010 um 08:07)

    • Offizieller Beitrag

    Das Problem hat folgende Ursache:
    Wenn in deinem Listview Daten sind sieht das etwa so aus
    LV-Index0 | WertA | SubA
    LV-Index1 | WertB | SubB
    LV-Index2 | WertC | SubC
    LV-Index3 | WertD | SubD

    Nehmen wir an, WertCC wird eingefügt (und einsortiert), dann sieht es so aus:
    LV-Index0 | WertA | SubA
    LV-Index1 | WertB | SubB
    LV-Index2 | WertC | SubC
    LV-Index3 | WertCC | SubCC
    LV-Index4 | WertD | SubD

    Da die Icons/Images aber dem LV-Index zugeordnet sind, stimmt nun die Zuordnung nicht mehr.
    Ich speichere den Index aus der Imageliste einfach mit _GUICtrlListView_SetItemParam() im Item selbst. Somit kann ich bei jeder Änderung aus dem Item selbst den Image-Index auslesen und das Image erneut setzen.

  • Hey BugFix!

    Mit _GUICtrlListView_SetItemParam habe ich jetz noch nicht gearbeitet.
    Also ich hatte das auf eine andere weisse probiert GUIImageList_Remove, ich bin davon ausgegangen das, wenn ein neues Item erstellt wird am ende vom Index erstellt wird und das, ImageListIndex ist auch 0-basierender wenn jetzt Item-5 von 8 gelöscht wird solten doch bei beiden Index die unteren Item´s und Icos´s hoch rutschen.
    Ansich ist das mit _GUICtrlListView_SetItemParam doch das gleiche oder??

    LG KLeiner

  • Hey!

    Habe mir da noch was überlegt!
    Ich lasse bei der Update Funktion prüfen ob sich nur der Titel geändert hat, wenn ja Item Text ändern, und wieder habe ich ein sonderbaren Fehler, wenn ich den eigenen Titel nicht anzeige lassen will wird der Image Index falsch angepasst???
    Ohne die Prüfung des eigenen Titel läuft alles gut!

    BugFix
    Ich habe deine (Hilfe) erst falsch verstanden, kann die Idee nicht umsetzen hast du vielleicht ein Beispiel.

    Spoiler anzeigen
    [autoit]

    ;#RequireAdmin
    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_UseX64=n
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

    [/autoit] [autoit][/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>

    [/autoit] [autoit][/autoit] [autoit]

    #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']

    [/autoit] [autoit][/autoit] [autoit]

    $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)

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlCreateTabItem('Anwendungen')
    $LV_SYS[0] = GUICtrlCreateListView('', 25, 50, 818, 315, 0x00010000 + $LVS_EX_DOUBLEBUFFER)
    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()
    _GUICtrlListView_BeginUpdate($Handle_LV_SYS[0])
    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]) <> '' And WinGetTitle($aWinList[$e][0]) <> WinGetTitle($Form[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
    _GUICtrlListView_EndUpdate($Handle_LV_SYS[0])
    $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, '')

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlCreateTabItem('Processe')
    $LV_SYS[1] = GUICtrlCreateListView('', 25, 50, 818, 315, 0x00010000 + $LVS_EX_DOUBLEBUFFER)
    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, '')

    [/autoit] [autoit][/autoit] [autoit]

    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')

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $iStatus = _GUICtrlStatusBar_Create($Form[0])
    _GUICtrlStatusBar_SetParts($iStatus, $iParts)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    AdlibRegister('Update', 1000)
    GUIRegisterMsg($WM_SIZE, 'WM_SIZE')
    GUIRegisterMsg(0x0024, 'MY_WM_GETMINMAXINFO')

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func WinListe_Update()
    Local $Temp[1], $F_Text
    Local $UB = _GUICtrlListView_GetItemCount($Handle_LV_SYS[0])
    Local $Win_Alt[$UB + 1], $Win_Alt_Prue[$UB + 1]
    $Win_Alt[0] = $UB
    $Win_Alt_Prue[0] = $UB
    For $i = 1 To $Win_Alt[0]
    $Win_Alt[$i] = _GUICtrlListView_GetItemText($Handle_LV_SYS[0], $i - 1, 0)
    $Win_Alt_Prue[$i] = _GUICtrlListView_GetItemText($Handle_LV_SYS[0], $i - 1, 4)
    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 <> '' And $F_Text <> WinGetTitle($Form[0])) Then ; wird ein Icon zu viel gelöscht ???????????
    ;If ($F_Text <> '') Then ; so ist alles OKAY ??????????????
    If BitAND(_ArraySearch($Win_Alt, $F_Text), @error) Then
    If Win_Alt_Prue($Win_Alt_Prue, $F_Text, $iWinList[$e][0]) Then
    _ArrayAdd($Temp, 'SetItemText')
    ContinueLoop
    EndIf
    _GUICtrlListView_AddItem($Handle_LV_SYS[0], $F_Text, _GUICtrlListView_GetItemCount($Handle_LV_SYS[0]) - 1)
    _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)
    _GUIImageList_AddIcon($Icon, $ExecutablePath[$i])
    EndIf
    _ArrayAdd($Temp, $F_Text)
    EndIf
    EndIf
    Next
    Next
    $Temp[0] = UBound($Temp) - 1
    If ($Temp[0] < $Win_Alt[0]) Then
    ReDim $Temp[UBound($Win_Alt)]
    For $i = 1 To $Win_Alt[0]
    If ($Win_Alt[$i] <> $Temp[$i] And $Temp[$i] <> 'SetItemText') Then _GUICtrlListView_DeleteItem($Handle_LV_SYS[0], $i - 1)
    Next
    EndIf
    If _GUICtrlListView_EndUpdate($Handle_LV_SYS[0]) Then _GUIImageList_SetImageCount($Icon, $Temp[0] - 1)
    EndFunc ;==>WinListe_Update

    [/autoit] [autoit][/autoit] [autoit]

    Func Win_Alt_Prue($Win_Alt_Prue, $F_Text, $iWinList); Prüfen ob sich nur der Titel geändert hat
    For $i = 1 To $Win_Alt_Prue[0]
    If ($Win_Alt_Prue[$i] = $iWinList) Then
    If _GUICtrlListView_SetItemText($Handle_LV_SYS[0], $i - 1, $F_Text) Then Return True
    EndIf
    Next
    Return False
    EndFunc ;==>Win_Alt_Prue

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    Func Com_Fehler()
    Switch $Com_Fehler
    Case 0
    $Error = False
    Case Else
    $Error = True
    EndSwitch
    EndFunc ;==>Com_Fehler

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    Func Ende()
    Exit
    EndFunc ;==>Ende

    [/autoit] [autoit][/autoit] [autoit]

    ;Func Form_HIDE()
    ; GUISetState(@SW_HIDE, @GUI_WinHandle)
    ;EndFunc ;==>Form_HIDE

    [/autoit] [autoit][/autoit] [autoit]

    ;Func Form_SHOW()
    ; GUISetState(@SW_SHOW, @GUI_WinHandle)
    ;EndFunc ;==>Form_SHOW

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit]

    LG Kleiner

  • Morgen!


    Habe mein Anligen mit _GUIImageList_DestroyIcon gelöst, die Index stelle werden sauber gelöscht und das, Index wird nicht unnötig vergrößert.
    Eine sache habe ich noch, ich Arbeite in der Update Func mit _GUICtrlListView_SetItemText nur beim ersetzen vom text Flackert das, ListView gib es dort eine lösung das, die Update Func nicht so beansprucht wird??


    LG Kleiner