二重起動を検知して最小化されている場合は表示する(最小版)
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();
}