C# で Mutex を使わずに、アプリケーションの多重起動を抑止する方法を書いていきます。
プロジェクトの概要
今回のコードは、以下のプロジェクトで検証しました。
プロジェクトの識別子
以下の値は「SingleInstance」にしています。
- ソリューション名
- プロジェクト名
- 名前空間
プログラムの編集
テンプレートのプログラムを、以下の内容に変更して保存します。
Program.cs
using System.Diagnostics; namespace SingleInstance { internal static class Program { [STAThread] static void Main() { if (IsSingleInstance()) { ApplicationConfiguration.Initialize(); Application.Run(new Form1()); } } private static bool IsSingleInstance() { // 配列には自分のプロセスも格納されるため、 // 同じプロセス名が存在しない場合の長さは1になります。 Process[] proc = Process.GetProcessesByName( Process.GetCurrentProcess().ProcessName ); return (proc.Length == 1); } } }
以下の値は、拡張子なしの EXE名でした。
Process.GetCurrentProcess().ProcessName
同じプロセス(EXE名)が実行中の場合に、後から起動したプロセスを終了する動きになります。
Mutexとの比較
今回の方法
EXE の名前(プロセス名)を変えると、同じアプリが起動できてしまいます。
Mutexを使う方法
アプリで任意の文字列を設定して、二重起動を禁止することができます。ただし、クローズ処理などが必要になります。
EXEを連打した場合
今回のアプリを連打して、二つ目のプロセスをすぐに起動するケースも試してみました。
自分の PC だと、二重起動は抑止されていました。