Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
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 =-