.NET TIPS Windowsアプリケーションの多重起動を禁止するには?デジタルアドバンテージ2004/04/09 |
|
|
多くのWindowsアプリケーションは、次の画面のように、独立したウィンドウとして複数起動して利用できる。
多重起動が可能なアプリケーション |
同じWindowsアプリケーションが複数起動している。 |
しかし、Windowsアプリケーションを1度に1つしか起動されたくない場合もあるだろう。例えばアプリケーションを複数起動されると、処理が競合して不整合が発生するような場合だ。このようなケースには、ミューテックス(Mutex:MUTual EXclusion の略で「相互排除」という意味)と呼ばれる機能を利用して、アプリケーションの多重起動を禁止することができる。
ミューテックスとは?
「ミューテックスの機能」とは、複数のスレッドが共有リソースに同時アクセスする場合に、たった1つのスレッドのみが排他的にアクセスできるようにして、スレッドを同期化するための機能である。
ミューテックスは、最初の1つのスレッドがミューテックスを取得すると、2番目以降のミューテックスを取得しようとするすべてのスレッドは、その最初のスレッドがミューテックスを解放するまで待機(中断)させられるという仕組みを提供する。このミューテックスの仕組みは、アプリケーション・ドメインやプロセスを超えて利用できるため、Windowsアプリケーション間でも利用できる。
よって、Windowsアプリケーションの多重起動を禁止するには、ミューテックスが取得できる最初のWindowsアプリケーションのみを実行して、ミューテックスが取得できない2番目以降のWindowsアプリケーションは警告を出して終了するようにすればよい。
ミューテックスの実装
ミューテックスは、Mutexクラス(System.Threading名前空間)に実装されている。まずはこのMutexクラスのインスタンス(以降、「Mutexオブジェクト」)を、コンストラクタを呼び出して生成する必要がある。
mutexObject = new Mutex(false, strAppConstName);
コンストラクタの第1パラメータには、今回の場合ではとりあえずfalseを設定しておけばよい。
第2パラメータには、ミューテックスの名前としてアプリケーション固有の名前を指定する。その際、その名前の先頭に「Global\」というプレフィックスを付加して「グローバル・ミューテックス」にすれば、Windows XPで実装された「Fast User Switching(参考:「新世代Windows、Windows XPを初体験(3)」)」のように複数のユーザー環境が同時実行される場合でも、複数ユーザー間でのアプリケーションの多重起動を禁止できる。ただし、グローバル・ミューテックスはWindows 2000以降しか対応していないので、これを利用するアプリケーションは必ずOSバージョンを確認する必要がある。グローバル・ミューテックスにすると、多重起動の場合にはMutexオブジェクトの生成時にApplicationException例外(System名前空間)が発生するようになるので、その例外をキャッチして多重起動の判別を行えばよい。
次に、ミューテックスを取得する。これには、MutexオブジェクトのWaitOneメソッドを呼び出す。このメソッドの戻り値は、ミューテックスの取得に成功すればtrue、失敗した場合にはfalseとなるため、アプリケーションの実行部分の処理は次のようになる。
if (mutexObject.WaitOne(0, false))
{
// アプリケーションの実行
}
else
{
// すでに起動されているので終了する
}
WaitOneメソッドの第1パラメータには、ミューテックスが取得できるまで待機する時間を指定する。今回は待機する必要はないので「0」を指定しておく。第2パラメータは今回の場合にはfalseを指定しておけばよい。詳細についてはリファレンス・マニュアルを参照していただきたい。
ミューテックスを取得できた場合は、(スレッドの)処理が完了した段階で取得したミューテックスをいったん解放する。これを行うにはMutexオブジェクトのReleaseMutexメソッドを呼び出す(ただし今回の目的の場合は、処理完了後すぐにアプリケーションを終了するので、必ずしも呼び出す必要はない)。
以上のMutexオブジェクトによる処理は、アプリケーションのエントリ・ポイント(アプリケーションが実行される最初のポイント)であるMainメソッドで行うとよいだろう。
それでは、実際のコード例を次に示す。
|
|
アプリケーションの多重起動禁止を実装したサンプル・コード(C#) | |
サンプル・プログラム(C#:winmutex.cs)のダウンロード
|
|
|
アプリケーションの多重起動禁止を実装したサンプル・コード(VB.NET) | |
サンプル・プログラム(VB.NET:winmutex.vb)のダウンロード
|
なお、アプリケーションの終了時などでMutexオブジェクトを破棄するには、MutexオブジェクトのCloseメソッドを呼び出せばよい。
カテゴリ:Windowsフォーム 処理対象:スレッド 使用ライブラリ:Mutexクラス(System.Threading名前空間) 使用ライブラリ:ApplicationExceptionクラス(System名前空間) |
「.NET TIPS」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|