000
06.12.2004, 15:38 Uhr
Audron-AT-www
http://www.sXene.de Audron@sxene.de (Operator)
|
"Läuft ein bestimmter Task noch - und wenn ja, wie kann ich diesen per Code beenden?"
Diese oder ähnliche Fragen stehen in unseren Diskussionsforen zur Zeit hoch im Kurs. Und deshalb möchten wir Ihnen heute einen Weg zeigen, wie sich prüfen lässt, ob eine bestimmte Anwendung (ein Task) noch ausgeführt wird oder nicht. Allerdings müssen wir hierzu die TaskID kennen. Zusätzlich zeigen wir dann noch, wie sich ein Task automatisch per VB-Code beenden lässt.
Erstellen Sie ein neues Projekt und fügen nachfolgende API-Deklarationen und Funktionen in ein neues Modul ein:
Visual Basic: |
Option Explicit
' hier die benötigten API-Deklarationen 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 GetExitCodeProcess Lib "kernel32" _ (ByVal hProcess As Long, lpExitCode As Long) As Long Private Declare Function TerminateProcess Lib "kernel32" _ (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Const STILL_ACTIVE = &H103 Const PROCESS_ALL_ACCESS = &H1F0FFF Const PROCESS_TERMINATE = &H1
' Prüfen, ob ein Task mit einer bestimmten ' TaskID noch aktiv ist Public Function IsTaskActive(lTaskID As Long) As Boolean Dim lhwnd As Long Dim lExitCode As Long lhwnd = OpenProcess(PROCESS_ALL_ACCESS, False, lTaskID) Call GetExitCodeProcess(lhwnd, lExitCode) Call CloseHandle(lhwnd) IsTaskActive = (lExitCode = STILL_ACTIVE) End Function
' Task beenden Public Sub TerminateTask(lTaskID As Long) Dim lhwnd As Long Dim lResult As Long lhwnd = OpenProcess(PROCESS_TERMINATE, 0&, lTaskID) lResult = TerminateProcess(lhwnd, 1&) lResult = CloseHandle(lhwnd) End Sub
|
Und um das ganze gleich einmal zu testen, plazieren Sie drei CommandButtons auf eine Form und nennen diese: cmdStart, cmdCheck und cmdExit. Über den ersten Button starten wir per Shell-Aufruf den Windows-Editor (Notepad). Den Rückgabewert des Shell-Aufruf (die TaskID) merken wir uns in der Variable lTaskID. Beim Klicken auf den 2. Button prüfen wir, ob die von uns aktivierte Instanz des Windows-Editor noch ausgeführt wird. Und über den dritten Button beenden wir Notepad letztendlich wieder.
Visual Basic: |
Option Explicit
' TaskID des von uns gestarteten Windows-Editor Private lTaskID As Long
Private Sub cmdStart_Click() ' Notepad starten Dim sWinPath As String sWinPath = Environ("WinDir") If Right$(sWinPath, 1) <> "\" Then _ sWinPath = sWinPath & "\" lTaskID = Shell(sWinPath & "notepad.exe", vbNormalFocus) End Sub
Private Sub cmdCheck_Click() ' Prüfen, ob das von uns gestartete Notepad ' noch läuft If IsTaskActive(lTaskID) Then MsgBox "Notepad wird noch ausgeführt!" Else MsgBox "Notepad wurde bereits beendet!" End If End Sub
Private Sub cmdExit_Click() ' Die von uns gestartete Notepad-Instant ' beenden If IsTaskActive(lTaskID) Then TerminateTask lTaskID MsgBox "Notepad wurde geschlossen." Else MsgBox "Notepad wird nicht mehr ausgeführt!" End If End Sub
|
-- Mit freundlichen Grüßen Audron, audron@sxene.de
Dieser Post wurde am 26.09.2005 um 16:53 Uhr von Uwe editiert. |