29 Stimmen

Wie finde ich heraus, ob ein Prozess bereits mit C# läuft?

Ich habe eine C# WinForms-Anwendung, die gelegentlich eine externe EXE starten muss, aber ich möchte keinen weiteren Prozess starten, wenn bereits einer läuft, sondern stattdessen zu diesem wechseln.

Also wie könnte ich das in C# im folgenden Beispiel machen?

using System.Diagnostics;

...

Process foo = new Process();

foo.StartInfo.FileName = @"C:\bar\foo.exe";
foo.StartInfo.Arguments = "Benutzername Passwort";

bool isRunning = //TODO: Überprüfen, ob der Prozess foo.exe bereits läuft

if (isRunning)
{
   //TODO: Zum foo.exe-Prozess wechseln
}
else
{
   foo.Start(); 
}

38voto

DaveK Punkte 4459

Dies sollte es für dich tun.

Prozesse überprüfen

//Namespaces, die wir verwenden müssen
using System.Diagnostics;

public bool IsProcessOpen(string name)
{
    //hier werden wir eine Liste aller laufenden Prozesse auf
    //dem Computer erhalten
    foreach (Process clsProcess in Process.GetProcesses()) {
        //jetzt werden wir prüfen, ob einer der laufenden Prozesse
        //den aktuell laufenden Prozessen entspricht. Stellen Sie sicher, dass Sie nicht
        //.exe zum Namen hinzufügen den Sie angeben, z. B.: NOTEPAD,
        //nicht NOTEPAD.EXE oder false wird immer zurückgegeben, selbst wenn
        //Notepad läuft.
        //Denken Sie daran, wenn der Prozess mehrmals ausgeführt wird,
        //sagen wir IE 4-mal geöffnet ist, wird die Schleife alle 4 schließen,
        //wenn Sie möchten, dass es nur den ersten findet und schließt
        //dann fügen Sie ein return; nach dem Kill hinzu
        if (clsProcess.ProcessName.Contains(name))
        {
            //wenn der Prozess als laufend gefunden wird, dann
            //geben wir ein true zurück
            return true;
        }
    }
    //ansonsten geben wir ein false zurück
    return false;
}

1 Stimmen

Wäre es nicht sicherer, Equals anstelle von Contains zu verwenden, dein Kommentar spiegelt nicht wider, wie sich das verhalten wird.
Wenn ich einen spezifischen Namen wie "notepad" angebe, wird es notepad.exe und jeden anderen Prozess finden, der notepad im Namen hat.

0 Stimmen

Die Zeile 'foreach (Process clsProcess in Process.GetProcesses) {' sollte wie folgt lauten 'foreach (Process clsProcess in Process.GetProcesses() {'.

0 Stimmen

Ein kleines Detail, das du vielleicht auch beim Check einbeziehen möchtest: || clsProcess.MainWindowTitle.ToLower().Contains(name), zum Beispiel in Fällen wie IsProcessOpen("malwarebytes") welche "mbam" aktiv hat.

24voto

aku Punkte 118808

Sie können auch LINQ verwenden,

var processExists = Process.GetProcesses().Any(p => p.ProcessName.Contains(""));

7voto

Gulzar Nazim Punkte 51098

Ich habe die AppActivate Funktion in der VB-Laufzeit verwendet, um einen vorhandenen Prozess zu aktivieren. Sie müssen die Microsoft.VisualBasic.dll in das C#-Projekt importieren.

using System;
using System.Diagnostics;
using Microsoft.VisualBasic;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            Process[] proc = Process.GetProcessesByName("notepad");
            Interaction.AppActivate(proc[0].MainWindowTitle);
        }
    }
}

4voto

aku Punkte 118808

Sie können Prozesse einfach mithilfe der Process.GetProcesses-Methode aufzählen.

2voto

Mnebuerquo Punkte 5548

In einem früheren Projekt musste ich die mehrfache Ausführung eines Prozesses verhindern, also fügte ich im Init-Bereich dieses Prozesses einige Code hinzu, der ein benanntes Mutex erstellt. Dieses Mutex wurde erstellt und erworben, bevor der Rest des Prozesses fortgesetzt wurde. Wenn der Prozess das Mutex erstellen und erwerben kann, ist er der erste, der ausgeführt wird. Wenn ein anderer Prozess bereits das Mutex steuert, dann ist derjenige, der scheitert, nicht der Erste, und er beendet sofort.

Ich versuchte nur zu verhindern, dass eine zweite Instanz aufgrund von Abhängigkeiten von bestimmten Hardware-Schnittstellen ausgeführt wird. Je nachdem, was Sie mit dieser "switch to"-Zeile benötigen, benötigen Sie möglicherweise eine spezifischere Lösung wie eine Prozess-ID oder einen Handle.

Außerdem hatte ich Zugriff auf den Quellcode des Prozesses, den ich starten wollte. Wenn Sie den Code nicht ändern können, ist das Hinzufügen des Mutex offensichtlich keine Option.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X