HOME >> Tips >> Microsoft.NET WPF

アプリケーションの2重起動(複数起動)を防止する

2014/04/10
文書番号:20384

WPF アプリケーションでアプリケーションの2重起動(複数起動)をさせない方法です。
基本的にはWindows Forms アプリケーションと同じでMutexを使用して2重起動をチェックします。


動作確認環境:Visua Studio 2010(vb) .NET Framework 4.0




【設定手順】

  1. WPFアプリケーションを作成すると「Applicaion.xaml」というファイルができています。
    このファイルのソースコードを開きます。
    「(Application イベント)」を選択して「Startup」と「Exit」を作成します。

    クリックで拡大

  2. ソースは以下のようになります。
    
        '多重起動チェックのためのミューテックス定義
        Private m As New System.Threading.Mutex(False, "ApplicationName")
        '起動するウインドウ
        Private w As MainWindow = Nothing
    
        Private Sub Application_Startup(sender As System.Object, e As System.Windows.StartupEventArgs)
    
            'ミューテックスの所有権を要求
            If m.WaitOne(0, False) = False Then
                '既に起動していると判断し終了する
                MessageBox.Show("既に起動しています。")
                'Mutexを破棄
                m.Close()
                m = Nothing
                'アプリケーション終了
                Me.Shutdown()
            Else
                'メイン画面を手動で初期化する
                w = New MainWindow
                'メイン画面を起動
                Call w.Show()
            End If
    
        End Sub
    
        Private Sub Application_Exit(sender As System.Object, e As System.Windows.ExitEventArgs)
            'ミューテックスの存在確認
            If m IsNot Nothing Then
                '存在する場合は破棄する
                m.ReleaseMutex()
                m.Close()
                m = Nothing
            End If
        End Sub
    
  3. 次に「Applicaion.xaml」を開きます。
    「Startup」と「Exit」は上記の方法で定義すると特に記載がなくても呼ばれるようです。
    実行してみて「Startup」が呼ばれないようであれば次のように書きます。

    クリックで拡大


    この次の行に「StartupUri」の記載がありますが、これを削除します。
    StartupUriの指定によってMainWindowを起動するようにしていると、Startupの中で2重起動を検知してShutdownをした際にもMainWindowのコンストラクタが実行されるようです。

    参考情報
    http://blog.syo-ko.com/?eid=1861#sequel

  4. 「Application.xaml」のソースは以下のようになります。
    4行目が追加した行です。これがなくても呼ばれるようになっていれば書かなくていいです。
    その次の行にあった「StartupUri」の記述は削除します。
    
    <Application x:Class="Application"
        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>
    
【参考情報】

  .NET アプリケーション (WPF/Windows フォーム) で多重起動を禁止し、単一のプロセスで動作させる
http://code.msdn.microsoft.com/windowsdesktop/NET-WPFWindows-20c6a2a0