Mutex を取得して新規に作成できれば新規の起動、取れなかったら 2つめの起動という感じに判断できます。
string key = "application_name"; using (var mutex = new Mutex(true, key, out bool createdNew)) { if (!createdNew) { return; // 多重起動になる } else { // 多重起動ではない → ここにメインの処理を記述する mutex.ReleaseMutex(); } }
定型的な処理なので Utility 化したいと思います。
// MultiStartupUtil.cs using System; using System.Threading; public static class MultiStartupUtil { public static void SingleStartupContext(string key, Action action) { using (var mutex = new Mutex(true, key, out bool createdNew)) { if (!createdNew) { return; } action?.Invoke(); mutex.ReleaseMutex(); } } }
使い方は以下の通りです。
// Program.cs using System; using System.Windows.Forms; internal static class Program { [STAThread] static void Main() { // 多重起動防止用のメソッドにキーとメイン処理を渡す MultiStartupUtil.SingleStartupContext("application_name", _Main); } // メイン処理をこっちに引っ越す private static void _Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); using (FormTaskTray formTaskTray = new FormTaskTray()) { Application.Run(); } } }