Code-Beispiel
Ein Beispiel zum Einsatz der Klasse System.Diagnostics.Process aus der .NET-Klassenbibliothek.
Autor: Dr. Holger Schwichtenberg
Beschreibung
Die Klasse Process bietet zwei verschiedene Methoden zum Beenden von Prozessen. - Die sanfte Methode ist CloseMainWindow(). Diese hat den gleichen Effekt wie der Aufruf von DATEI/BEENDEN im Hauptfenster einer Windows-Anwendung durch den Benutzer. Wenn Änderungen an einem Dokument vorgenommen wurden, fragt die Anwendung den Benutzer zunächst, ob die Änderungen gespeichert werden sollen. Der Benutzer kann speichern oder den Beendigungs-Vorgang abbrechen. Die Methode liefert True zurück, wenn der Beendigungs-Vorgang angestoßen werden konnte. Ein True sagt aber nichts darüber aus, ob die Anwendung auch tatsächlich geschlossen wurde. False bedeutet, die Anwendung kann derzeit nicht normal beendet werden, z.B. weil ein Dialogfenster geöffnet ist.
- Im Fall von Kill() hat der Benutzer keinen Einfluss: Der Prozess wird sofort ohne Nachfrage beendet. Änderungen an offenen Dokumenten werden nicht gespeichert.
Die Klasse Process kann nur lokale Prozesse beenden. Es ist hiermit nicht möglich, Prozesse auf entfernten Computern zu beenden. Dies kann mit der WMI-Klasse Win32_Process erfolgen.
Beispiel
Das folgende Beispiel beendet alle laufenden Instanzen des Internet Explorers (Dateiname: iexplorer.exe, Prozessname: iexplore). Zunächst wird versucht, den Prozess mit CloseMainWindow() zu beenden. Wenn das nicht funktioniert, wird Kill() aufgerufen.
Programmcodebeispiele Visual Basic .NET (VB.NET)
' ============================
' .NET-Code-Beispiel in Visual Basic .NET
' Alle Internet Explorer-Prozesse stoppen
' (C) Holger@Schwichtenberg.de
' ============================
Sub Prozesse_Stoppen()
Const PNAME As String = "IEXPLORE"
Dim p As System.Diagnostics.Process
Dim pp As System.Diagnostics.Process()
' --- Prozesse dieses Namens ermitteln
pp = Process.GetProcessesByName(PNAME)
' --- Schleife über diese Prozesse
out("Beenden aller Prozesse mit Namen: " & PNAME)
out("Anzahl Prozesse: " & pp.Length)
For Each p In pp
out("Prozess: " & p.Id & " wird beendet...")
' --- Beenden-Anfrage stellen...
If p.CloseMainWindow Then
' --- Normales Ende
out(" Prozess wurde normal beendet!")
Else
' --- Keine Reaktion -> gewaltsames Ende
p.Kill()
out(" Prozess wurde gewaltsam beendet!")
End If
Next
End Sub
Programmcodebeispiele CSharp (C#)
using System;
using System.Diagnostics;
namespace FCLBuch._SystemDiagnostics {
public class Samples_Prozesse {
public void Prozesse_Stoppen() {
// Alle Internet Explorer-Prozesse stoppen
string processName = "iexplore";
// Prozesse dieses Namens ermitteln
Process[] pp = Process.GetProcessesByName(processName);
// Schleife über diese Prozesse
FclOutput.PrintOut("Beenden aller Prozesse mit Namen: " + processName);
FclOutput.PrintOut("Anzahl Prozesse: " + pp.Length);
foreach ( Process p in pp ) {
FclOutput.PrintOut("Prozess: " + p.Id + " wird beendet...");
// Beenden Anfrage stellen...
if ( p.CloseMainWindow() ) {
// Normales Ende
FclOutput.PrintOut(" Prozess wurde normal beendet!");
} else {
// Keine Reaktion -> gewaltsames Ende
p.Kill();
FclOutput.PrintOut(" Prozess wurde gewaltsam beendet!");
}
}
}
}
}
Hinweise
Ausgaben werden in den Beispielen durch Hilfsroutinen wie out() und
PrintOut() erzeugt. Diese sind hier nicht angegeben, da deren Implementierung
von der jeweiligen Umgebung abhängt. Für Konsolenanwendungen können hier z.B.
Console.WriteLine() einsetzen.
Querverweise
Liste aller Codebeispiele
Definition '.NET Framework Class Library'
Verfügbarkeit der Klasse 'System.Diagnostics.Process'
Übersicht über den FCL-Namensraum 'System.Diagnostics'
.NET & Visual Studio Community Portal