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