アプリケーションの二重起動を抑止する - C#

概要

C#でアプリケーションの二重起動をさせないコードを紹介します。
常駐ソフトなどでは、アプリケーションを二つ以上起動させたくない場合があります。ミューテックスを利用することで多重起動を抑止できます。
C#の Windows フォームアプリケーションでは、Progarm.csファイルのMain()関数内にミューテックスの処理を記述することで実現できます。

記述例

下記のコードを Program.cs の main()関数内に記述します。
//ミューテックス作成
_mutex = new System.Threading.Mutex(false, "MYSOFTWARE_001");
     
//ミューテックスの所有権を要求する
if (_mutex.WaitOne(0, false) == false) {
  MessageBox.Show("本ソフトウェアは複数起動できません。");
  return;
}

プログラム例

Windowsフォームアプリケーションを作成します。

UI

下図のUIを作成します。フォームにLabelを配置します。

コード

下記のコードを記述します。
Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;

namespace SingleApplicationExecute
{
  static class Program
  {
    /// <summary>
    /// アプリケーションのメイン エントリ ポイントです。
    /// </summary>
    [STAThread]
    static void Main()
    {
      //ミューテックス作成
      Mutex app_mutex = new Mutex(false, "MYSOFTWARE_001");

      //ミューテックスの所有権を要求する
      if (app_mutex.WaitOne(0, false) == false) {
        MessageBox.Show("このアプリケーションは複数起動できません。");
        return;
      }
      
      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
      Application.Run(new FormMain());
    }
  }
}

フォームのコードには追加の記述はありません。
FormMain.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace SingleApplicationExecute
{
  public partial class FormMain : Form
  {
    public FormMain()
    {
      InitializeComponent();
    }
  }
}

実行結果

今回は複数の起動をテストするため、デバッガではなく実行ファイルを直接起動します。ビルド結果が保存されているディレクトリを開き、プログラムを起動します。


プログラムが起動し、下図のウィンドウが表示されます。


1つ目のプログラムが起動している状態で、実行ファイルをダブルクリックし、2つ目のプログラムを起動します。


プログラムを起動すると、下図の「このアプリケーションは複数起動できません。」のメッセージボックスが表示され、プログラムの起動はできません。



アプリケーションを2重に起動しようとすると、警告ダイアログが表示されアプリケーションの起動が抑止される動作を実装できました。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2009-02-11
iPentec all rights reserverd.