Veröffentlicht: 06. Dez 2002 | Aktualisiert: 09. Nov 2004
Von Mathias Schiffer
Mithilfe von .NET Framework können Sie externe Anwendungen so starten, dass es möglich ist, zu überprüfen ob die gestartete Anwendung noch aktiviert ist. Auch das Beenden eines Fremdprozesses ist auf einfache Weise möglich.
Im MSDN Quickie "Anwendungen starten und ihr Ende abwarten" wurde gezeigt, wie man mit Visual Basic 6.0 eine Fremdanwendung so starten kann, dass später überprüfbar ist, ob die Fremdanwendung noch aktiv ist. Oft sollen externe Anwendungen für die eigene Anwendung eine Dienstleistung erbringen, wobei von Interesse ist, ob die externe Anwendung diese Dienstleistung bereits erbracht hat.
Auf dieser Seite
Eine Anwendung kontrolliert starten
Auf das Ende der externen Anwendung warten
Die externe Anwendung beenden
Eine Anwendung kontrolliert starten
In Visual Basic .NET wird Ihnen diese Aufgabe komplett vom .NET Framework abgenommen. Die Klasse System.Diagnostics.Process stellt Ihnen die entsprechenden Werkzeuge zur Verfügung. Statt die VB-eigene Funktion Shell zu verwenden, übergeben Sie einer Instanz der Process-Klasse den Pfad- und Dateinamen in der Eigenschaft StartInfo.FileName und starten die Anwendung dann mithilfe der Start-Funktion.
Dim ExterneAnwendung As New System.Diagnostics.Process()
ExterneAnwendung.StartInfo.FileName = "notepad.exe"
ExterneAnwendung.Start()
Selbst das Starten registrierter Dateitypen in ihren zugehörigen Anwendungen kann so vorgenommen werden (etwa für eine Textdatei "c:\textdatei.txt"). Mit Visual Basic 6.0 war hierfür der Aufruf der API-Funktion ShellExecute notwendig (siehe MSDN Quickie "Aus VB heraus Dokumente in zugehörigen Anwendungen öffnen"). Einfacher macht dies im .NET Framework die Process-Eigenschaft StartInfo.UseShellExecute, die standardmäßig den Wert True hat.
Prüfen, ob die externe Anwendung noch aktiv ist
Haben Sie eine externe Anwendung auf diese Weise gestartet, so können Sie ihren derzeitigen Zustand über Eigenschaften des Process-Objekts abfragen.
Die Abfrage, ob die Anwendung bereits beendet wurde, beschränkt sich auf das einfache Auslesen der Eigenschaft HasExited:
If ExterneAnwendung.HasExited Then
MessageBox.Show("Die gestartete Anwendung " & _
ExterneAnwendung.StartInfo.FileName & _
" wurde beendet.")
Else
MessageBox.Show("Die gestartete Anwendung " & _
ExterneAnwendung.StartInfo.FileName & _
" ist noch aktiv.")
End If
Auf das Ende der externen Anwendung warten
Statt die Abfrage der HasExited-Eigenschaft in einer Schleife durchzuführen, um auf das Ende einer gestarteten Anwendung zu warten, können Sie auch die Methode WaitForExit des Process-Objekts verwenden. Sie hält den ausführenden Thread Ihrer Anwendung so lange an, bis die externe Anwendung beendet wurde (auch ein Neuzeichnen einer Benutzeroberfläche Ihres Threads findet in diesem Zeitraum nicht statt):
ExterneAnwendung.WaitForExit()
Möchten Sie auf das Beenden der externen Anwendung lediglich eine maximale Zeitspanne lang warten, so können Sie diese Zeitspanne in Millisekunden als Parameter an die Funktion WaitForExit übergeben. Wird die externe Anwendung vor Ablauf dieser Zeitspanne beendet, kehrt die Funktion sofort zurück und liefert als Rückgabewert True. Wurde die externe Anwendung bis zum Ablauf der Zeitspanne hingegen nicht beendet, erhalten Sie den Rückgabewert False:
If ExterneAnwendung.WaitForExit(5000) = True Then
MessageBox.Show("Die gestartete Anwendung " & _
ExterneAnwendung.StartInfo.FileName & _
" wurde innerhalb von 5 Sekunden beendet.")
Else
MessageBox.Show("Die gestartete Anwendung " & _
ExterneAnwendung.StartInfo.FileName & _
" ist auch nach 5 Sekunden noch aktiv.")
End If
Die externe Anwendung beenden
Mithilfe eines Process-Objekts gestartete Anwendungen können Sie aus Ihrem Code heraus auch wieder beenden. Für Anwendungen, die eine Benutzeroberfläche anbieten, kann durch Aufruf der Funktion CloseMainWindow versucht werden, das Hauptfenster der Anwendung zu schließen. Dieses Vorgehen entspricht der Verwendung des Menüpunkts "Schließen" im Systemmenü einer Anwendung.
War der Versuch von Erfolg gekrönt, gibt die Funktion True zurück. Der Rückgabewert False kann hingegen mehrere Gründe haben: Für fensterlose Anwendungen wird systematisch bedingt generell False retourniert. Hat die Anwendung ein Hauptfenster, so signalisiert der Rückgabewert False, dass die Anwendung durch den Versuch des Schließens des Hauptfensters nicht beendet werden konnte. Ein möglicher Grund hierfür wäre beispielsweise die typische Rückfrage einer Anwendung an den Anwender, ob ungesicherte Arbeit gespeichert werden soll.
If ExterneAnwendung.HasExited = False Then
If ExterneAnwendung.CloseMainWindow() = False Then
MessageBox.Show("Der Versuch, das Hauptfenster von " & _
ExterneAnwendung.StartInfo.FileName & _
" zu schließen, ist fehlgeschlagen." & _
" Die Anwendung ist noch aktiv.")
Else
MessageBox.Show("Der Versuch, das Hauptfenster von " & _
ExterneAnwendung.StartInfo.FileName & _
" zu schließen, war erfolgreich." & _
" Die Anwendung wurde beendet.")
End If
End If
Möchten Sie sicherstellen, dass die externe Anwendung vorbehaltlos beendet wird, so können Sie die Process-Methode Kill verwenden. Hierbei wird die externe Anwendung nicht auf dem für sie vorgesehenen Weg beendet, sondern - wie über die Schaltfläche "Prozess beenden" der Prozessliste im Windows NT Task-Manager - gnadenlos aus dem Speicher geworfen. Diese Option sollten Sie nur dann verwenden, wenn ein Datenverlust der externen Anwendung nicht auftreten kann oder irrelevant ist.
Idealerweise verwenden Sie statt der alleinigen Verwendung der Kill-Methode ein zweistufiges Vorgehen, um der externen Anwendung zuerst die Chance zu geben, sich auf ihrem vorgesehenen Weg zu beenden, bevor Sie zum härteren Mittel greifen:
If ExterneAnwendung.HasExited = False Then
If ExterneAnwendung.CloseMainWindow() = False Then
ExterneAnwendung.Kill()
End If
End If