• システム開発に関わる内容をざっくりと書いていく

二重起動検知

二重起動を検知して最小化されている場合は表示する(最小版)

Mutex mutex = new Mutex(true, "MainMenu", out createdNew);

if (!createdNew)
{            	
    var proc = Process.GetCurrentProcess();
    var otherProc = Process.GetProcessesByName(proc.ProcessName)
                           .Where(v => v.Id != proc.Id)
                           .FirstOrDefault();
    if (otherProc != null)
    {
        IntPtr hWnd = otherProc.MainWindowHandle;
        if (IsIconic(hWnd))
        {
            ShowWindowAsync(hWnd, SW_RESTORE);
        }
        SetForegroundWindow(hWnd);
        return;
    }
}

実務版

// Mutexを使って二重起動を検知する
        using (Mutex mutex = new Mutex(true, "MainMenu", out bool createdNew))
        {
            // 既に同じ名前のプロセスが起動しているかチェック
            if (!createdNew)
            {
                try
                {
                    // 現在のプロセスを取得
                    var currentProcess = Process.GetCurrentProcess();

                    // 現在のプロセスとは異なる同名のプロセスを探す
                    var otherProcess = Process.GetProcessesByName(currentProcess.ProcessName)
                                              .FirstOrDefault(p => p.Id != currentProcess.Id);

                    if (otherProcess != null)
                    {
                        // 他のプロセスのウィンドウハンドルを取得
                        IntPtr hWnd = otherProcess.MainWindowHandle;

                        // ウィンドウが最小化されている場合は復元
                        if (IsIconic(hWnd))
                        {
                            ShowWindowAsync(hWnd, SW_RESTORE);
                        }

                        // フォアグラウンドにウィンドウを持ってくる
                        SetForegroundWindow(hWnd);

                        // アプリケーションの二重起動を防ぐため終了
                        return;
                    }
                }
                catch (Exception ex)
                {
                    // 例外が発生した場合にエラーメッセージを表示
                    Console.WriteLine("エラーが発生しました: " + ex.Message);
                    return;
                }
            }

            // メインのアプリケーションの処理を開始
            RunMainApplication();
        }