Task ermitteln und terminieren

Task ermitteln und terminieren: GetDesktopWindow, GetWindowThreadProcessId, TerminateProcess
'Verbleibt eine Anwendung nach dem Beenden im Speicher,
'wird sie mit großer Wahrscheinlichkeit mit End beendet.
'Dies hat den Nachteil, daß Dialoge und Objekte nicht
'entladen, Datenbanken nicht geschlossen, Captures
'und Hooks nicht freigegeben werden.
'Der Stop-Button in der VB-IDE hat übrigens die gleiche
'Wirkung wie End.
'Eine Anwendung wird korrekt mit Unload beendet.
'Dieser Source stammt von http://www.activevb.de/
'und kann frei verwendet werden.
'Für eventuelle Schäden wird nicht gehaftet.
Private Declare Function GetDesktopWindow Lib "user32" () _
As Long
Private Declare Function GetWindow Lib "user32" (ByVal hWnd _
As Long, ByVal wCmd As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias _
"GetWindowLongA" (ByVal hWnd As Long, ByVal wIndx As _
Long) As Long
Private Declare Function GetWindowTextLength Lib "user32" _
Alias "GetWindowTextLengthA" (ByVal hWnd As Long) _
As Long
Private Declare Function GetWindowText Lib "user32" Alias _
"GetWindowTextA" (ByVal hWnd As Long, ByVal lpString _
As String, ByVal cch As Long) As Long
Private Declare Function GetParent Lib "user32" (ByVal hWnd _
As Long) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" _
(ByVal hWnd As Long, lpdwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal _
hObject As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal _
dwDesiredAccess As Long, ByVal bInheritHandle As Long, _
ByVal dwProcessId As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32" (ByVal _
hProcess As Long, ByVal uExitCode As Long) As Long
Const GW_HWNDFIRST = 0
Const GW_HWNDLAST = 1
Const GW_HWNDNEXT = 2
Const GW_HWNDPREV = 3
Const GW_OWNER = 4
Const GW_CHILD = 5
Const GW_MAX = 5
Const GWL_STYLE = (-16)
Const WS_VISIBLE = &H10000000
Const WS_BORDER = &H800000
Const PROCESS_TERMINATE = &H1
Dim x& 'Anzahl der Prozesse
Private Sub EnumWindows()
Dim hWnd&
List1(0).Clear
List1(1).Clear
List1(2).Clear
hWnd = GetDesktopWindow 'Auch der Desktop ist ein Fenster
Call GetWindowInfo(hWnd)
hWnd = GetWindow(Me.hWnd, GW_HWNDFIRST) 'Einstieg
Do 'Alle vorhandenen Fenster durchlaufen
Call GetWindowInfo(hWnd)
hWnd = GetWindow(hWnd, GW_HWNDNEXT)
Loop Until hWnd = 0
End Sub
Private Sub GetWindowInfo(ByVal hWnd&)
Dim Parent&, Task&, Result&, Style&, Title$
Style = GetWindowLong(hWnd, GWL_STYLE) 'Darstellung des Fensters
Style = Style And (WS_VISIBLE Or WS_BORDER)
Result = GetWindowTextLength(hWnd) + 1
Title = Space$(Result) 'Title des Fensters auslesen
Result = GetWindowText(hWnd, Title, Result)
Title = Left$(Title, Len(Title) - 1)
If (Title <> "" Or (Check1.Value = vbChecked)) And _ 'In Abhängigkeit der Optionen die Ausgabe erstellen
(Style = (WS_VISIBLE Or WS_BORDER) Or Option2.Value) Then
List1(0).AddItem CStr(hWnd)
List1(1).AddItem Title
Parent = hWnd 'Elternfenster ermitteln
Do
Parent = GetParent(Parent)
Loop Until Parent = 0
Result = GetWindowThreadProcessId(hWnd, Task) 'Task Id ermitteln
List1(2).AddItem Task
x = x + 1 'Anzahl der Prozesse
End If
End Sub
Private Sub Option1_Click()
x = 0
Call EnumWindows
Me.Caption = x & " offene Prozesse ermittelt... "
End Sub
Private Sub Option2_Click()
x = 0
Call EnumWindows
Me.Caption = x & " offene Prozesse ermittelt... "
End Sub
Private Sub Check1_Click()
x = 0
Call EnumWindows
Me.Caption = x & " offene Prozesse ermittelt... "
End Sub
Private Sub Command1_Click() 'Refresh
x = 0
Call EnumWindows
Me.Caption = x & " offene Prozesse ermittelt... "
End Sub
Private Sub Command2_Click() 'Task beenden
Dim Result&, Task&
If List1(2).ListIndex > -1 Then
Result = CLng(List1(2).List(List1(2).ListIndex))
Task = OpenProcess(PROCESS_TERMINATE, 0&, Result)
Result = TerminateProcess(Task, 1&)
Result = CloseHandle(Task)
End If
End Sub
Private Sub Form_Load()
x = 0
Call EnumWindows
Me.Caption = x & " offene Prozesse ermittelt... "
End Sub
Private Sub List1_Click(Index As Integer)
Static Flag, y%
If Flag Then Exit Sub
Flag = True
For y = 0 To List1.UBound
List1(y).ListIndex = List1(Index).ListIndex
List1(y).TopIndex = List1(Index).TopIndex
Next y
Flag = False
End Sub

Mehr Tipps: Papierkorb komplett leeren

Sponsoren und Investoren

Sponsoren und Investoren sind jederzeit herzlich willkommen!
Wenn Sie die Information(en) auf dieser Seite interessant fanden, freuen wir uns über eine kleine Spende. Empfehlen Sie uns bitte auch in Ihren Netzwerken (z. B. Twitter, Facebook oder Google+). Herzlichen Dank!

Nach oben Sitemap
Impressum & Kontakt