Hallo,
ich habe den Tipp "Alle laufenden Programme ermitteln" und den Tipp "Einen Prozess beenden" zusammengeworfen und daraus einen kleinen Taskmonitor gebastelt. Der Sinn ist, dem Anwender den von MS zu sperren und trotzdem die Möglichkeit zu geben, abgestürzte Programme zu killen. So weit, so gut. Das geht. Jetzt habe ich das Problem, das wenn ich z.B. 'Arbeitsplatz' oder 'Eigene Dateien' damit abschieße, diese den Explorer mitkillen, aber dass soll es ja nicht sein!!!
Wie muss denn der Code aussehen, dass das nicht passiert???
Danke
hier mal der function-Code aus dem Modul:
Public Function GetWindowList(oLSV As ListView, _
Optional bVisible As Boolean = True)
' oLSV - Ein beliebiges ListView, das die
' Informationen aufnehmen soll
' bVisible - Wenn True werden nur sichtbare Windows
' angezeigt, bei False alles
Dim sTitle As String
Dim oListItem As ListItem
' ListView-Spalten festlegen
With oLSV.ColumnHeaders
.Clear
.Add , "hWnd", "hWnd"
.Add , "TaskID", "TaskID"
.Add , "Title", "Title"
'.Add , "Visible", "Visible"
End With
' Inhalt löschen und umschalten auf "Detail"-Ansicht
oLSV.ListItems.Clear
oLSV.View = lvwReport
' Erstes WindowHandle holen
hwnd = GetWindow(oLSV.Parent.hwnd, GW_HWNDFIRST)
Do
' Handle auswerten und im ListView eintragen
lStyle = GetWindowLong(hwnd, GWL_STYLE)
lStyle = lStyle And (WS_VISIBLE Or WS_BORDER)
sTitle = GetWindowTitle(hwnd)
lTaskID = GetWindowTaskID(hwnd)
If (lStyle = (WS_VISIBLE Or WS_BORDER)) = bVisible Then
' in das ListView eintragen
If sTitle <> "" Then 'Ausblenden von offenen Fenstern ohne Namen(z.B.
' Windows-Taskleiste)
Set oListItem = oLSV.ListItems.Add(, , hwnd)
With oListItem
.SubItems(1) = lTaskID
.SubItems(2) = sTitle
' .SubItems(3) = lStyle = (WS_VISIBLE Or WS_BORDER)
End With
End If
End If
' Nächstes Handle
hwnd = GetWindow(hwnd, GW_HWNDNEXT)
Loop Until hwnd = 0
End Function
Private Function GetWindowTaskID(ByVal hwnd As Long) _
As Long
' Ermittelt die TaskID eines Windows anhand des
' Window Handle
Dim lResult As Long
Dim lTemp As Long
lResult = GetWindowThreadProcessId(hwnd, lTemp)
GetWindowTaskID = lTemp
End Function
Private Function GetWindowTitle(ByVal hwnd As Long) _
As String
' Ermittelt den Namen eines Windows anhand des
' Window Handle
Dim lResult As Long
Dim sTemp As String
lResult = GetWindowTextLength(hwnd) + 1
sTemp = Space(lResult)
lResult = GetWindowText(hwnd, sTemp, lResult)
GetWindowTitle = Left(sTemp, Len(sTemp) - 1)
End Function
' Task beenden
Public Sub TerminateTask(hwnd As Long)
Dim lhwnd As Long
Dim lResult As Long
lhwnd = OpenProcess(PROCESS_TERMINATE, 0&, hwnd)
lResult = TerminateProcess(lhwnd, 1&)
lResult = CloseHandle(lhwnd)
End Sub |