Prozess in Angeklickter listview schließen?

  • hi @ all
    habe wieder ne frage:
    Ich habe von Greenhorn meinen Code angepasst bekommen das er alle Prozesse die
    aktiv sind in einer ListView angezeigt werden.
    Jetzt versuche ich wen mann auf den Button "Prozess Schließen" klickt
    das der ausgewählte Prozess in der ListView sich schließt.
    und wäre es möglich eine MSGBox zu öffnen die nachfrägt ob man den Prozess wirklich
    schließen will vorher anzeigt?
    MfG Roggazzz

    P.S: Hier der Code:

    [autoit]

    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <StaticConstants.au3>
    #include <ListViewConstants.au3>

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

    Global $aProcessList
    ; $aidLVItems enthält die IDs der Elemente des Listenansicht-Steuerelements.
    Global $aidLVItems [1] = [0] ; erstem Element Null zuweisen
    Global $drive,$dir,$fname,$ext, $lID

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

    $hWnd = GUICreate ("RogProgs TaskManager", _
    350, 460, -1, -1, _
    $WS_OVERLAPPEDWINDOW, _
    $WS_EX_CLIENTEDGE)

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

    $idButton1 = GUICtrlCreateButton ("Prozess &Starten", 168, 0, 121, 25, 0)
    $idButton2 = GUICtrlCreateButton ("Prozess Be&enden", 16, 416, 113, 25, 0)
    $idInput1 = GUICtrlCreateInput ("Prozess Name", 24, 8, 121, 21)
    $idLabel1 = GUICtrlCreateLabel ("Offene Prozesse:", 32, 32, 85, 17)
    $idUhrzeit = GUICtrlCreateLabel ("Uhrzeit", 240, 424, 37, 17)

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

    $ID_LISTVIEW = GUICtrlCreateListView ("Prozessname|PID", 0, 50, 350, 350)

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

    If (Not UpdateProcessList ($aProcessList, $ID_LISTVIEW, $aidLVItems)) Then

    MsgBox (266256, "Fehler", "Es konnten keine Prozesse aufgelistet werden!")
    EndIf

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

    GUISetState (@SW_SHOW, $hWnd)

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

    While True

    Switch GUIGetMsg ( )
    Case $GUI_EVENT_CLOSE
    Exit

    Case $idButton1
    ShellExecute(GuiCtrlread($idInput1))

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

    EndSwitch
    WEnd

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

    ; UpdateProcessList (ByRef $aProcesses, $idListView, $aidLVItems)
    ; Diese Funktion aktualisiert die Listenansicht.
    ; Rückgabe: True bei Erfolg, sonst False.
    ; [in/out]$aProcesses - Arrayvariable in der die Prozessliste gespeichert werden soll
    ; [in] $idListView - Identifizierer des Listenansicht-Steuerelements
    ; [in] $aidLVItems - Arrayvariable, welche die Elemente der Listenansicht enthält
    Func UpdateProcessList (ByRef $aProcesses, $idListView, ByRef $aidLVItems)

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

    $aProcesses = ProcessList ( )

    If (Not IsArray ($aProcesses)) Then _
    Return False ; Fehler

    ;-- Wenn weniger Elemente in der Listenansicht, als Prozesse ...
    If ($aidLVItems[0] < $aProcesses[0][0]) Then

    ; Array vergrößern.
    ReDim $aidLVItems [$aProcesses[0][0] + 1]

    ;- Wenn aidLVItems[0] ungleich Null ...
    If ($aidLVItems[0]) Then

    ; Existierende Elemente in der Listenansicht aktualisieren
    For $i = 1 To $aidLVItems[0]
    GUICtrlSetData ($aidLVItems[$i], $aProcesses[$i][0] & "|" & $aProcesses[$i][1])
    Next

    ; Neue Elemente in der Listenansicht erzeugen
    For $i = $aidLVItems[0] + 1 To $aProcesses[0][0]
    $aidLVItems[$i] = GUICtrlCreateListViewItem ($aProcesses[$i][0] & _ ; Prozessname
    "|" & _
    $aProcesses[$i][1], _ ; PID
    $idListView)
    Next

    ;- aidLVItems[0] gleich Null ...
    Else

    ; Ein Element/Prozess in der Listenansicht erzeugen.
    For $i = 1 To $aProcesses[0][0]

    $aidLVItems[$i] = GUICtrlCreateListViewItem ($aProcesses[$i][0] & _ ; Prozessname
    "|" & _
    $aProcesses[$i][1], _ ; PID
    $idListView)
    Next
    EndIf

    $aidLVItems[0] = $aProcesses[0][0]

    ;-- Wenn mehr Elemente in der Listenansicht, als Prozesse ...
    ElseIf ($aidLVItems[0] > $aProcesses[0][0]) Then

    ; Existierende Elemente in der Listenansicht aktualisieren
    For $i = 1 To $aidLVItems[0]
    If ($i <= $aProcesses[0][0]) Then
    GUICtrlSetData ($aidLVItems[$i], $aProcesses[$i][0] & "|" & $aProcesses[$i][1])
    Else
    GUICtrlDelete ($aidLVItems[$i])
    EndIf
    Next

    ; Array verkleinern.
    ReDim $aidLVItems [$aProcesses[0][0] + 1]

    EndIf

    Return True ; Erfolg

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

    EndFunc
    ;

    [/autoit]
  • Wo ist das Problem ???

    GUICtrlRead, MsgBox, ProcessClose ...

    Außerdem ist noch ein grober Patzer in der UpdateProcessList.
    Ganz unten, bei "Array verkleinern" fehlt natürlich noch etwas ...

    [autoit]

    ; Array verkleinern.
    ReDim $aidLVItems [$aProcesses[0][0] + 1]
    $aidLVItems [0] = $aProcesses[0][0] ; fehlte noch ...
    ;

    [/autoit]


    Wie gesagt, habe das aktualisieren der Listenansicht nicht getestet ...


    Gruß
    Greenhorn


    Einmal editiert, zuletzt von Greenhorn (13. Mai 2009 um 18:26)

  • Also bei mir funktioniert alles perfekt, soweit ... ;)

    Spoiler anzeigen
    [autoit]

    ;
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <StaticConstants.au3>
    #include <ListViewConstants.au3>

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

    $sMsgWarning_ProcessClose = "WARNUNG: Das Abbrechen eines Prozesses kann zu \n" & _
    "unerwünschten Ergebnissen, einschließlich Datenverlust und \t\n" & _
    "Systeminstabilität, führen. Zustand und Daten des Prozesses \n" & _
    "werden nicht mehr gespeichert. Sind Sie sicher, dass Sie \n" & _
    "den Prozess abbrechen möchten?"

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

    Global $user32dll = DllOpen ("user32.dll")

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

    Global $ID_TIMER

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

    Global $aProcessList
    ; $aidLVItems enthält die IDs der Elemente des Listenansicht-Steuerelements.
    Global $aidLVItems [1] = [0] ; erstem Element Null zuweisen

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

    $hWnd = GUICreate ("RogProgs TaskManager", _
    350, 460, -1, -1, _
    $WS_OVERLAPPEDWINDOW, _
    $WS_EX_CLIENTEDGE)

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

    $idButton1 = GUICtrlCreateButton ("Prozess &Starten", 168, 0, 121, 25, 0)
    $idButton2 = GUICtrlCreateButton ("Prozess Be&enden", 16, 416, 113, 25, 0)
    $idInput1 = GUICtrlCreateInput ("Dateiname", 24, 8, 121, 21)
    $idLabel1 = GUICtrlCreateLabel ("Offene Prozesse:", 32, 32, 85, 17)
    $idUhrzeit = GUICtrlCreateLabel ("Uhrzeit", 240, 424, 80, 17)

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

    $ID_LISTVIEW = GUICtrlCreateListView ("Prozessname|PID", 0, 50, 350, 350)

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

    ; Alle 500 ms WM_TIMER aufrufen lassen.
    SetTimer ($hWnd, $ID_TIMER, 500, 0)

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

    GUIRegisterMsg ($WM_TIMER, "WM_TIMER")
    GUIRegisterMsg ($WM_DESTROY, "WM_DESTROY")

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

    GUISetState (@SW_SHOW, $hWnd)

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

    While True

    Switch GUIGetMsg ( )
    Case $GUI_EVENT_CLOSE
    ExitLoop

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

    Case $idButton1
    ShellExecute (GUICtrlRead ($idInput1))

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

    Case $idButton2
    $iReaction = MsgBox (266292, "Warnung von RogProgs TaskManager", _
    StringFormat ($sMsgWarning_ProcessClose, ""))
    ; Ja/Nein-Rückgabe behandeln ...
    If ($iReaction == 6) Then

    EndIf

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

    EndSwitch
    WEnd

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

    ; UpdateProcessList (ByRef $aProcesses, $idListView, ByRef $aidLVItems)
    ; Diese Funktion aktualisiert die Listenansicht.
    ; Rückgabe: Anzahl der Prozesse bei Erfolg, sonst Null.
    ; [in/out]$aProcesses - Arrayvariable in der die Prozessliste gespeichert werden soll
    ; [in] $idListView - Identifizierer des Listenansicht-Steuerelements
    ; [in/out] $aidLVItems - Arrayvariable, welche die Elemente der Listenansicht enthält
    Func UpdateProcessList (ByRef $aProcesses, $idListView, ByRef $aidLVItems)

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

    $aProcesses = ProcessList ( )

    If (Not IsArray ($aProcesses)) Then _
    Return 0 ; Fehler

    ;-- Wenn weniger Elemente in der Listenansicht, als Prozesse ...
    If ($aidLVItems[0] < $aProcesses[0][0]) Then

    ; Array vergrößern.
    ReDim $aidLVItems [$aProcesses[0][0] + 1]

    ;- Wenn aidLVItems[0] ungleich Null ...
    If ($aidLVItems[0]) Then

    ; Existierende Elemente in der Listenansicht aktualisieren
    For $i = 1 To $aidLVItems[0]
    GUICtrlSetData ($aidLVItems[$i], $aProcesses[$i][0] & "|" & $aProcesses[$i][1])
    Next

    ; Neue Elemente in der Listenansicht erzeugen
    For $i = $aidLVItems[0] + 1 To $aProcesses[0][0]
    $aidLVItems[$i] = GUICtrlCreateListViewItem ($aProcesses[$i][0] & _ ; Prozessname
    "|" & _
    $aProcesses[$i][1], _ ; PID
    $idListView)
    Next

    ;- aidLVItems[0] gleich Null ...
    Else

    ; Ein Element/Prozess in der Listenansicht erzeugen.
    For $i = 1 To $aProcesses[0][0]

    $aidLVItems[$i] = GUICtrlCreateListViewItem ($aProcesses[$i][0] & _ ; Prozessname
    "|" & _
    $aProcesses[$i][1], _ ; PID
    $idListView)
    Next
    EndIf

    $aidLVItems[0] = $aProcesses[0][0]

    ;-- Wenn mehr Elemente in der Listenansicht, als Prozesse ...
    ElseIf ($aidLVItems[0] > $aProcesses[0][0]) Then

    ; Existierende Elemente in der Listenansicht aktualisieren
    For $i = 1 To $aidLVItems[0]
    If ($i <= $aProcesses[0][0]) Then
    GUICtrlSetData ($aidLVItems[$i], $aProcesses[$i][0] & "|" & $aProcesses[$i][1])
    Else
    GUICtrlDelete ($aidLVItems[$i])
    EndIf
    Next

    ; Array verkleinern.
    ReDim $aidLVItems [$aProcesses[0][0] + 1]
    $aidLVItems [0] = $aProcesses[0][0]

    EndIf

    Return $aProcesses[0][0] ; Erfolg

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

    EndFunc
    ;

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

    Func WM_TIMER ($hWnd, $uMsg, $wParam, $lParam)

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

    $res = UpdateProcessList ($aProcessList, $ID_LISTVIEW, $aidLVItems)
    If (Not $res) Then

    ConsoleWrite ("!> UpdateProcessList: "&$res & @crlf)
    Else
    ConsoleWrite ("> UpdateProcessList: "&$res & @crlf)
    EndIf

    Return 0

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

    EndFunc

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

    Func WM_DESTROY ($hWnd, $uMsg, $wParam, $lParam)

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

    KillTimer ($hWnd, $ID_TIMER)
    DllClose ($user32dll)
    Return $GUI_RUNDEFMSG

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

    EndFunc

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

    Func KillTimer ($hwnd, $uIDEvent)

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

    Local $aRes = DllCall ($user32dll, 'int', 'KillTimer', _
    'hwnd', $hwnd, _
    'uint', $uIDEvent)

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

    Return $aRes [0]

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

    EndFunc

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

    Func SetTimer ($hwnd, $uIDEvent, $uElapse, $lpTimerFunc)

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

    Local $aRes = DllCall ($user32dll, 'int', 'SetTimer', _
    'hwnd', $hwnd, _
    'uint', $uIDEvent, _
    'uint', $uElapse, _
    'ptr', $lpTimerFunc)
    Return $aRes [0]

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

    EndFunc
    ;

    [/autoit]


    Gruß
    Greenhorn


    Einmal editiert, zuletzt von Greenhorn (13. Mai 2009 um 20:50)