【C#】アプリケーションの2重起動防止(Mutex)
※これが本当に正しいかは自信ありません。。
Windowsフォームアプリケーションの場合
static class Program { // 重複起動チェック用 private static Mutex mutex; static void Main() { bool hasHandle = false; // 初期所有権なしでMutexを生成 // Mutex名を固有にするためGUIDを使用する // GUIDはVisual studio > [ツール] > [GUIDの生成]から生成 using (mutex = new Mutex(false, "{D2B320CD-4CDB-404D-BB95-1D2E0090DBE5}")) { try { //--------------------------------------------------------- // 二重起動のチェック //--------------------------------------------------------- try { // Mutexの所有権を要求 hasHandle = mutex.WaitOne(0, false); } catch (AbandonedMutexException) { // 別アプリがMutexオブジェクトを開放しないで終了した場合 hasHandle = true; } if (hasHandle == false) { // Mutexの所有権が得られなかったため、起動済みと判断して終了 MessageBox.Show("二重起動のため、プログラムは終了します。"); return; } //--------------------------------------------------------- // アプリケーション開始 //--------------------------------------------------------- Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } catch (Exception ex) { // アプリケーション例外処理 } finally { if (hasHandle) { mutex.ReleaseMutex(); } mutex.Close(); } } }
WPFアプリケーションの場合
public partial class App : Application { // 重複起動チェック用 private static Mutex mutex; /// <summary> /// アプリケーションが終了する時のイベント /// </summary> /// <param name="e"></param> protected override void OnExit(ExitEventArgs e) { if (mutex == null) { return; } // ミューテックスの開放 mutex.ReleaseMutex(); mutex.Close(); mutex = null; } /// <summary> /// アプリケーションが開始される時のイベント /// </summary> /// <param name="e"></param> protected override void OnStartup(StartupEventArgs e) { try { bool hasHandle = false; // 初期所有権なしでMutexを生成 // Mutex名を固有にするためGUIDを使用する // GUIDはVisual studio > [ツール] > [GUIDの生成]から生成 mutex = new Mutex(false, "{D2B320CD-4CDB-404D-BB95-1D2E0090DBE5}"); //--------------------------------------------------------- // 二重起動のチェック //--------------------------------------------------------- try { // Mutexの所有権を要求 hasHandle = mutex.WaitOne(0, false); } catch (AbandonedMutexException) { // 別アプリがMutexオブジェクトを開放しないで終了した場合 hasHandle = true; } if (hasHandle == false) { // 所有権が得られなかった場合、起動済みと判断して終了 MessageBox.Show("二重起動のため、プログラムを終了します"); mutex.Close(); mutex = null; this.Shutdown(); return; } //--------------------------------------------------------- // アプリケーション開始 //--------------------------------------------------------- MainWindow window = new MainWindow(); window.Show(); } catch (Exception) { // アプリケーション例外処理 MessageBox.Show("エラーが発生した為、プログラムを終了します"); this.Shutdown(); } } }