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(); 
}

2voto

Israel Ocbina Punkte 453

Ich habe herausgefunden, dass Mutex nicht wie in der Konsolenanwendung funktioniert. Daher löst das Abfragen von Prozessen, die im Task-Manager-Fenster angezeigt werden können, Ihr Problem.

Verwenden Sie so etwas wie dies:

static bool isStillRunning() {
   string processName = Process.GetCurrentProcess().MainModule.ModuleName;
   ManagementObjectSearcher mos = new ManagementObjectSearcher();
   mos.Query.QueryString = @"SELECT * FROM Win32_Process WHERE Name = '" + processName + @"'";
   if (mos.Get().Count > 1)
   {
        return true;
    }
    else
        return false;
}

HINWEIS: Fügen Sie dem Assemblyverweis "System.Management" hinzu, um die Typintellisense zu aktivieren.

0 Stimmen

Dieser Ansatz ermöglicht die Überprüfung der Befehlszeilenargumente (mo["CommandLine"]);

1voto

jmatthias Punkte 7075

Ich glaube, die vollständige Antwort auf dein Problem erfordert ein Verständnis dafür, was passiert, wenn deine Anwendung feststellt, dass eine Instanz von foo.exe bereits läuft, d.h. was bedeutet eigentlich '//TODO: Wechsel zum foo.exe-Prozess'?

1voto

Jay Bazuzi Punkte 43111

Zwei Punkte, die zu beachten sind:

  1. Ihr Beispiel beinhaltet das Eingeben eines Passworts auf einer Befehlszeile. Diese Klartext-Darstellung eines Geheimnisses könnte eine Sicherheitslücke darstellen.

  2. Beim Auflisten von Prozessen sollten Sie sich fragen, welche Prozesse Sie wirklich auflisten möchten. Alle Benutzer oder nur den aktuellen Benutzer? Was ist, wenn der aktuelle Benutzer zweimal eingeloggt ist (zwei Desktops)?

0voto

csjohnst Punkte 1668

Mnebuerquo schrieb:

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.

Ich habe keinen Zugriff auf den Quellcode des Prozesses, den ich ausführen möchte.

Letztendlich habe ich den MainWindowHandle des Prozesses verwendet, um zum Prozess zu wechseln, sobald ich festgestellt habe, dass er bereits läuft:

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
 public static extern bool SetForegroundWindow(IntPtr hWnd);

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