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 =-

Comments (0)

Skip to main content