HUSKING - kotteri

技術系Note

【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();
        }
    }
}