メモメモ.
アプリケーションが立ち上がる前に確認しなければならないので,
App.xaml.cs のスタートアップイベントを登録して記述します.
まず App.xaml に次のような記述をします.
1 2 3 4 5 6 7 8 |
<Application x:Class="Sample.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Startup="Application_Startup" Exit="Application_Exit"> <Application.Resources> </Application.Resources> </Application> |
Startup イベントと Exit イベントにハンドラを追加しています.
次に App.xaml.cs に当該ハンドラを実装します.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
private System.Threading.Mutex mutex = new System.Threading.Mutex(false, "ApplicationName"); private void Application_Startup(object sender, StartupEventArgs e) { // ミューテックスの所有権を要求 if (!mutex.WaitOne(0, false)) { // 既に起動しているため終了させる MessageBox.Show("ApplicationName は既に起動しています。", "二重起動防止", MessageBoxButton.OK, MessageBoxImage.Exclamation); mutex.Close(); mutex = null; this.Shutdown(); } } |
ポイントは 1 行目と 6 行目.
1 行目で特定の名前を付けた Mutex を生成します.
6 行目ではミューテックスの所有権を要求し,
特定の名前が既に使われているかどうかを確認しています.
上記の例では,既に使われている場合は
メッセージダイアログを表示した後にアプリケーションを終了させています.
もちろん mutex の Close() 等の後片付けを忘れずに.
アプリケーションを終了するときの処理も忘れずに.
1 2 3 4 5 6 7 8 |
private void Application_Exit(object sender, ExitEventArgs e) { if (mutex != null) { mutex.ReleaseMutex(); mutex.Close(); } } |
mutex を解放しておかないと,
ひとつも起動していないのに
ミューテックスの所有権を得られずに二度と起動できないことになってしまいます.