”C# 二重起動 禁止”等で検索するとMutexを使った方法を紹介したページがヒットしますが、これでは後から起動されようとしたインスタンスのコマンドライン引数を取得出来ません。
自分で、既に起動済みのインスタンスにコマンドラインを渡して、受け側で処理する様に実装しなければいけません。これでは面倒です。VB.NET 2005では簡単に二重起動を禁止して、引数も取得出来ました。
同じクラスライブラリなのだから、VBに出来てC#に出来ない筈は無いと考え、調べてみました。下準備をすればVBと同じ方法で二重起動を禁止し、引数も取得出来ることがわかりました。以下にその方法を紹介します。
まず、”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でコマンドライン引数を取得出来る } }
myApplication_StartupNextInstanceメソッドの中には、VB.NETの方法の時と同じ様にコーディング出来ます。詳しくは検索すればわかりやすいページがあるでしょう。
次に、プログラムのエントリポイントを書き換えます。
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); } }
こんなに簡単な方法があるのに、検索しても紹介されているのを見たことがありません。この方法に何か問題があるのかも知れませんね。
知っている方がいましたらコメント下さい。