Freitag, 9. Juli 2010

Prozess beenden

In diesem Post stand, wie man mit C# Prozesse startet, heute möchte ich euch zeigen, wie man sie wieder beendet.
Im .Net Studio gibt es dazu zwei Funktionen, beide aus der Klasse System.Diagnostics.Process.
Die erste Funktion heißt CloseMainWindow(). Sie schließt den Prozess auf die "sanfte" Art, hängt er also oder wartet auf eine Benutzereingabe (d.h. ein Dialogfeld befindet sich im Vordergrund, wie z.B. "Speichern vor Beenden?"), wird die Beendingung nicht erzwungen.
Das Beenden eines Prozesses kann man mit der Funktion Kill() erzwingen. Die beiden Funktionen lassen sich mit "Task beenden" und "Prozess beenden" aus dem Taskmanager vergleichen.
Um Zugriff auf einen laufenden Prozess zu kriegen, benötigt man z.B. die Funktion Process.GetProcessesByName(). Diese erwartet einen String als Parameter, der den Prozessnamen angibt und liefert ein Array vom Typ System.Diagnostics.Process zurück, in dem alle Prozesse mit übereinstimmendem Namen gespeichert sind.
Die folgende Funktion versucht, den übergebenen Prozess zuerst mittels CloseMainWindow() zu beenden, wartet dann 500ms und beendet diesen - sofern noch nicht erfolgt - per Kill().

        private void TerminateProcess(string processName)
        {
            Process[] MatchingProcesses = Process.GetProcessesByName(processName);

            foreach (Process p in MatchingProcesses)
            {
                p.CloseMainWindow();
            }

            System.Threading.Thread.Sleep(500);

            MatchingProcesses = Process.GetProcessesByName(processName);

            foreach (Process p in MatchingProcesses)
            {
                p.Kill();
            }
        }

Beim Aufrufen der Funktion ist zu beachten, dass der Prozessnamen ohne die Endung ".exe" übergeben werden muss, also so z.B.:

private void Form1_Load(object sender, EventArgs e)
{
    TerminateProcess("firefox");
}

Kommentare:

  1. Bin begeistert, hat super funktioniert!!!
    Liebe Grüße

    AntwortenLöschen
  2. Hat auch bei mir gleich super funktioniert.
    Danke!

    AntwortenLöschen
  3. Vor
    p.Kill()
    sollte noch abgefragt werden, ob der Process nicht vielleicht schon durch
    p.CloseMainWindow()
    beendet wurde, sonst hagelts Exceptions. Das geht mit
    p.HasExited

    ------------------------------
    if (p.HasExited == false)
    p.Kill();
    ------------------------------

    AntwortenLöschen
    Antworten
    1. geht noch kürzer
      if(!p.HasExited)
      p.Kill();

      Löschen
  4. Hey,
    kann man mit C# auch ein anderes Programm pausieren? Also das es stehen bleibt? Zum Beispiel mit Notepad, wenn man das pausiert soll das einfach hängen bleiben als wenn das abgestürzt wäre und wenn man das pausieren beendet soll das ganz normal weiterlaufen sodass man wieder darein tippen kann?

    AntwortenLöschen