C#のWindowsアプリケーションで二重起動を禁止するにはMutexを使う方法がある。
Mutexを使った方法では、後から起動されようとしたインスタンスのコマンドライン引数を、起動済みのインスタンスが受け取ることが出来ない。
Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBaseを用いることで上記の問題を解決出来る。 Microsoft.VisualBasicをプロジェクトの参照に追加して次のようなクラスを用意する。
using System.IO;
using Microsoft.VisualBasic.ApplicationServices;
class myApplication:WindowsFormsApplicationBase{
public myApplication()
: base() {
this.EnableVisualStyles = true;
this.IsSingleInstance = true;
this.MainForm = new Form1();//スタートアップフォームを設定
this.StartupNextInstance += new StartupNextInstanceEventHandler(myApplication_StartupNextInstance);
}
void myApplication_StartupNextInstance(object sender, StartupNextInstanceEventArgs e) {
//ここに二重起動されたときの処理を書く
//e.CommandLineでコマンドライン引数を取得出来る
}
}
上記のクラスは次の様にエントリポイントで使用する
using System;
static class Program {
[STAThread]
static void Main(string[] args) {
//Application.EnableVisualStyles();
//Application.SetCompatibleTextRenderingDefault(false);
//Application.Run(new Form1());
myApplication winAppBase = new myApplication();
winAppBase.Run(args);
}
}