web-dev-qa-db-fra.com

Comment vérifier si une autre instance de l'application est en cours d'exécution

Doublons possibles:
Quelle est la bonne façon de créer une application à instance unique?
Retour à une application déjà ouverte lorsqu'un utilisateur essaie d'ouvrir une nouvelle instance

Quelqu'un pourrait-il montrer comment il est possible de vérifier si une autre instance du programme (par exemple test.exe) est en cours d'exécution et, dans l'affirmative, arrêter le chargement de l'application s'il existe une instance existante de celui-ci.

39
Tom

Vous voulez du code sérieux? C'est ici.

var exists = System.Diagnostics.Process.GetProcessesByName(System.IO.Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetEntryAssembly().Location)).Count() > 1;

Cela fonctionne pour n'importe quelle application (n'importe quel nom) et deviendra true s'il y a une autre instance en cours d'exécution de la même application .

Modifier: pour résoudre vos besoins, vous pouvez utiliser l'un des éléments suivants:

if (System.Diagnostics.Process.GetProcessesByName(System.IO.Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetEntryAssembly().Location)).Count() > 1) return;

de votre méthode principale pour quitter la méthode ... OU

if (System.Diagnostics.Process.GetProcessesByName(System.IO.Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetEntryAssembly().Location)).Count() > 1) System.Diagnostics.Process.GetCurrentProcess().Kill();

ce qui tuera instantanément le processus de chargement en cours.


Vous devez ajouter une référence à System.Core.dll pour la .Count() méthode d'extension. Vous pouvez également utiliser la propriété .Length.

112
Vercas

Vous ne savez pas ce que vous entendez par "le programme", mais si vous souhaitez limiter votre application à une seule instance, vous pouvez utiliser un Mutex pour vous assurer que votre application n'est pas déjà en cours d'exécution.

[STAThread]
static void Main()
{
    Mutex mutex = new System.Threading.Mutex(false, "MyUniqueMutexName");
    try
    {
        if (mutex.WaitOne(0, false))
        {
            // Run the application
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MainForm());
        }
        else
        {
            MessageBox.Show("An instance of the application is already running.");
        }
    }
    finally
    {
        if (mutex != null)
        {
            mutex.Close();
            mutex = null;
        }
    }
}
55
Patrik Svensson

Voici quelques bons exemples d'applications. Voici une façon possible.

public static Process RunningInstance() 
{ 
    Process current = Process.GetCurrentProcess(); 
    Process[] processes = Process.GetProcessesByName (current.ProcessName); 

    //Loop through the running processes in with the same name 
    foreach (Process process in processes) 
    { 
        //Ignore the current process 
        if (process.Id != current.Id) 
        { 
            //Make sure that the process is running from the exe file. 
            if (Assembly.GetExecutingAssembly().Location.
                 Replace("/", "\\") == current.MainModule.FileName) 

            {  
                //Return the other process instance.  
                return process; 

            }  
        }  
    } 
    //No other instance was found, return null.  
    return null;  
}


if (MainForm.RunningInstance() != null)
{
    MessageBox.Show("Duplicate Instance");
    //TODO:
    //Your application logic for duplicate 
    //instances would go here.
}

De nombreuses autres manières possibles. Voir les exemples pour des alternatives.

Premier.

Second One.

Troisième

EDIT 1: Je viens de voir votre commentaire que vous avez une application console. Cela est discuté dans le deuxième échantillon.

13
CharithJ

Vous pouvez essayer ceci

Process[] processes = Process.GetProcessesByName("processname");
foreach (Process p in processes)
{
    IntPtr pFoundWindow = p.MainWindowHandle;
    // Do something with the handle...
    //
}
0
R Quijano

La classe statique Process possède une méthode GetProcessesByName () que vous pouvez utiliser pour rechercher dans les processus en cours d'exécution. Recherchez simplement tout autre processus portant le même nom d'exécutable.

0
KeithS