ミューテックスを使って多重起動を抑止する
外部ハードウェアを扱うようなアプリケーションを製作する場合、多重起動について気を使う必要があります。たとえばカメラを扱うようなアプリケーションがそれにあたります。
初回の起動は当然ながらカメラと通信できますが、ユーザがアプリケーションアイコンの多重ダブルクリックなど性急な動作をしてしまうと、2回目に起動した同じアプリケーションが不具合を起こすばかりか、場合によっては初回に正しく起動したアプリケーションを巻き込んでシステムの不具合を起こすこともあります。
これを避けるには、アプリケーションの起動直後にミューテックス Mutex という仕組みを使って、すでに起動しているか、そうでないかを判断すればいいです。下記のコードでそれが実現できます。
初心者の方は Form1.cs 以外の場所をあまり見たことがないと思いますが、VisualStudioのソリューションエクスプローラで Program.cs というところをシングルクリックしてその中に下記のコードを書いてください。
第2引数の「ユニークな文字列」というところが、とても重要です。プロジェクトをコピーして使いまわしてアプリケーションを作成している場合は、かならずこのユニークな文字列というところを書き直してください。書き直さないと、全然違うアプリケーションなのに、それらが同時に起動できなくなってしまいます。
using System;
using System.Threading;
using System.Windows.Forms;
namespace aaa
{
internal static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault( false );
// 第1引数でこのスレッドがミューテックスを作成してすぐに所有権を持つか決定します.
// 第2引数はユニークな文字列を指定します, GUID などがおすすめです.
// 第3引数はミューテックスのコンストラクタの実行結果が格納されます.
bool initially_owned = true;
String str_unique = "my_unique_mutex_name";
bool flag_created_new;
using ( Mutex mutex = new Mutex( initially_owned, str_unique, out flag_created_new ) )
{
if ( flag_created_new )
{
// フォームを作成してアプリ動作を開始する.
Application.Run( new Form1() );
// フォームが閉じられたらアプリケーション終了なのでミューテックスを解放する.
mutex.ReleaseMutex();
}
else
{
MessageBox.Show( "プログラムは既に起動しています." );
}
}
}
}
}