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