2014年8月21日木曜日

WPF アプリで、二重起動を禁止する

WPF アプリケーションで二重起動を禁止するにはどうすればいいのだろう?
よく使いそうな機能なので覚えておくと使えそう。 

調べたら、Mutex クラスを使えばいいことがわかりました。


方法が簡単だったので、アプリケーション設定で二重起動を制御してみます。

まずは、App クラスの Startup イベントと Exit イベントを追加します。
Startup イベントで、MainWindow の表示を行うので、StartupUri プロパティは削除します。

<Application x:Class="WpfApplication.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             Startup="OnStartup" Exit="OnExit">
    <Application.Resources />
</Application>

次は追加したイベントです。
Startup イベントで、Mutex を作成して、すでに起動しているか判断します。
Exit イベントでは、Mutex を開放しています。

using System;
using System.Threading;
using System.Windows;

public partial class App : Application
{
    private static Mutex mutex = null;

    private bool isSingleInstance = false;

    private void OnStartup(object sender, StartupEventArgs e)
    {
        this.isSingleInstance = WpfApplication.Properties.Settings.Default.IsSingleInstance;

        if (this.isSingleInstance)
        {
            var name = this.GetType().Assembly.GetName().Name;
            mutex = new Mutex(false, name);

            if (!mutex.WaitOne(TimeSpan.Zero, false))
            {
                mutex.Close();
                this.Shutdown();
                return;
            }
        }

        var mainWindow = new MainWindow();
        mainWindow.Show();
    }

    private void OnExit(object sender, ExitEventArgs e)
    {
        if (mutex != null)
        {
            mutex.ReleaseMutex();
            mutex.Close();
        }
    }
}

実行ファイル名を変更しても二重起動できませんでした。


頑張りすぎず脱力系でいこうと思います。
以上。

0 件のコメント:

コメントを投稿