Partager via


NET : comment éviter qu'une application ne soit lancée 2 fois ?

En utilisant la classe Mutex qui fonctionne inter-process ! Voici un exemple de code :

using System;

using System.Collections.Generic;

using System.Windows.Forms;

using System.Threading;

using System.Runtime.InteropServices;

using System.Diagnostics;

namespace TestMutex

{

    static class Program

    {

        [STAThread]

        static void Main()

        {

            Application.EnableVisualStyles();

            Application.SetCompatibleTextRenderingDefault(false);

            string sMutexName = "MON_APPLICATION"; // ou tout autre identificateur, qui peut être unique à l'utilisateur en cours

            bool bCreated;

            // Crée le mutex inter-process

            Mutex m = new Mutex(true, sMutexName, out bCreated);

           

            if (bCreated) // si le mutex a pu être acquis

            {

                // on lance la première instance de l'appli

                Application.Run(new Form1());

                m.ReleaseMutex(); // on relâche le mutex

            }

            else

            { // sinon on ne lance pas l'appli, et on passe la première instance en avant-plan

              

                // On récupère la liste des process avec le bon nom

                string sProcessName = Process.GetCurrentProcess().ProcessName;

                Process[] processes = Process.GetProcessesByName(sProcessName);

                // On va récupérer l'objet Process pour la première instance (ie la plus vieille)

                DateTime oldestTime = DateTime.Now;

                Process oldestProcess = null;

                foreach(Process p in processes)

                {

                    if (p.StartTime < oldestTime)

                    {

                        oldestTime = p.StartTime;

                        oldestProcess = p;

                    }

                }

                // Si on a trouvé la plus vieille instance

                if (oldestProcess != null)

                {

                    // On lui donne le focus

                    try

                    {

                        SetForegroundWindow(oldestProcess.MainWindowHandle);

                    }

                    catch { }

                }

            }

        }

        [DllImport("user32.dll")]

        [return: MarshalAs(UnmanagedType.Bool)]

        static extern bool SetForegroundWindow(IntPtr hWnd);

    }

}

 

-= David =-