Comment puis-je savoir si un processus fonctionne déjà avec c#?

j'ai l'application c# winforms qui a besoin de démarrer un exe externe de temps en temps, mais je ne souhaite pas démarrer un autre processus si un est déjà en cours, mais plutôt passer à celui-ci.

alors comment en C# est-ce que je le ferais dans l'exemple ci-dessous?

using System.Diagnostics;

...

Process foo = new Process();

foo.StartInfo.FileName = @"C:barfoo.exe";
foo.StartInfo.Arguments = "Username Password";

bool isRunning = //TODO: Check to see if process foo.exe is already running


if (isRunning)
{
   //TODO: Switch to foo.exe process
}
else
{
   foo.Start(); 
}
24
demandé sur csjohnst 2008-09-09 06:54:06

9 réponses

Cela devrait le faire pour toi.

Vérifier Les Processus

//Namespaces we need to use
using System.Diagnostics;

public bool IsProcessOpen(string name)
{
    //here we're going to get a list of all running processes on
    //the computer
    foreach (Process clsProcess in Process.GetProcesses()) {
        //now we're going to see if any of the running processes
        //match the currently running processes. Be sure to not
        //add the .exe to the name you provide, i.e: NOTEPAD,
        //not NOTEPAD.EXE or false is always returned even if
        //notepad is running.
        //Remember, if you have the process running more than once, 
        //say IE open 4 times the loop thr way it is now will close all 4,
        //if you want it to just close the first one it finds
        //then add a return; after the Kill
        if (clsProcess.ProcessName.Contains(name))
        {
            //if the process is found to be running then we
            //return a true
            return true;
        }
    }
    //otherwise we return a false
    return false;
}


30
répondu DaveK 2011-08-11 00:47:50

Vous pouvez aussi utiliser LINQ,

var processExists = Process.GetProcesses().Any(p => p.ProcessName.Contains("<your process name>"));
22
répondu aku 2008-09-09 03:35:58

j'ai utilisé la fonction AppActivate dans VB runtime pour activer un processus existant. Vous devrez importer Microsoft.La dll de VisualBasic dans le projet C#.

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);
        }
    }
}
6
répondu Gulzar Nazim 2008-09-09 03:09:34

vous pouvez simplement énumérer les processus en utilisant Processus.GetProcesses méthode.

4
répondu aku 2008-09-09 03:01:27

J'ai découvert que Mutex ne fonctionne pas comme dans L'application Console. Ainsi, l'utilisation de WMI pour interroger les processus qui peuvent être vus en utilisant la fenêtre de gestionnaire de tâches résoudra votre problème.

Utilisez quelque chose comme ceci:

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

NOTE: Ajouter système de référence d'assemblage".Gestion" pour activer le type intellisense.

2
répondu Israel Ocbina 2014-05-23 08:26:41

je pense que la réponse complète à votre problème nécessite de comprendre ce qui se passe lorsque votre application détermine qu'une instance de foo.l'exe est déjà en I. e What does ' / / TODO: Switch to foo.exe processus " signifie réellement?

1
répondu jmatthias 2008-09-09 03:07:23

dans un projet antérieur j'avais besoin d'empêcher l'exécution multiple d'un processus, donc j'ai ajouté un certain code dans la section init de ce processus qui crée un mutex nommé. Ce mutext a été créé et acquis avant de poursuivre le reste du processus. Si le processus peut créer le mutex et l'acquérir, alors il est le premier de la course. Si un autre processus contrôle déjà le mutex, alors celui qui échoue n'est pas le premier donc il sort immédiatement.

je viens d'essayer d'empêcher un deuxième instance à partir de l'exécution, en raison de dépendances sur des interfaces matérielles spécifiques. En fonction de ce dont vous avez besoin avec cette ligne "switch to", Vous pourriez avoir besoin d'une solution plus spécifique comme un identifiant de processus ou une poignée.

de plus, j'avais accès au code source du processus que j'essayais de démarrer. Si vous ne pouvez pas modifier le code, ajouter le mutex n'est évidemment pas une option.

1
répondu Mnebuerquo 2008-09-09 03:43:28

Deux questions à garder à l'esprit:

  1. votre exemple impliquait de placer un mot de passe sur une ligne de commande. Que représentation en clair d'un secret pourrait être une faille de sécurité.

  2. Lors de l'énumération des processus, demandez vous-même qui vous traite vraiment souhaitez énumérer. Tous les utilisateurs, ou juste l'utilisateur actuel? Que faire si le l'utilisateur courant est connecté deux fois (deux les ordinateurs de bureau)?

1
répondu Jay Bazuzi 2008-09-09 04:29:19

Mnebuerquo a écrit:

Aussi, j'ai eu accès au code source de l' j'ai essayer de démarrer. Si vous ne peut pas modifier le code, en ajoutant le mutex n'est évidemment pas une option.

Je n'ai pas accès au code source du processus que je veux exécuter.

j'ai fini par utiliser la MainWindowHandle proccess pour passer au processus une fois que j'ai trouvé qu'il est déjà en cours d'exécution:

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
 public static extern bool SetForegroundWindow(IntPtr hWnd);
0
répondu csjohnst 2008-09-09 03:50:13