1

アプリケーションの他のインスタンスが実行されているかどうかを WPF アプリケーションで確認することは可能ですか? インスタンスを 1 つだけ持つアプリケーションを作成しています。ユーザーが再度開こうとすると、「別のインスタンスが実行中です」というメッセージが表示されます。

アプリケーションの名前と一致するようにプロセス ログを確認する必要があると思いますが、それを行う方法がわかりません。

4

1 に答える 1

7

exe がコピーされて名前が変更されている場合、名前によるプロセスの取得戦略は失敗する可能性があります。プロセス名に .vshost が追加されるため、デバッグも問題になる可能性があります。

WPF で単一インスタンス アプリケーションを作成するには、App.Xaml ファイルから StartupUri 属性を削除して、次のようにすることから始めます。

<Application x:Class="SingleInstance.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
</Application>

その後、App.xaml.cs ファイルに移動して、次のように変更できます...

public partial class App 
{
    // give the mutex a  unique name
    private const string MutexName = "##||ThisApp||##";
    // declare the mutex
    private readonly Mutex _mutex;
    // overload the constructor
    bool createdNew;
    public App() 
    {
        // overloaded mutex constructor which outs a boolean
        // telling if the mutex is new or not.
        // see http://msdn.microsoft.com/en-us/library/System.Threading.Mutex.aspx
        _mutex = new Mutex(true, MutexName, out createdNew);
        if (!createdNew)
        {
            // if the mutex already exists, notify and quit
            MessageBox.Show("This program is already running");
            Application.Current.Shutdown(0);
        }
    }
    protected override void OnStartup(StartupEventArgs e)
    {
        if (!createdNew) return;
        // overload the OnStartup so that the main window 
        // is constructed and visible
        MainWindow mw = new MainWindow();
        mw.Show();
    }
}

これにより、ミューテックスが存在するかどうかがテストされ、存在する場合、アプリはメッセージを表示して終了します。それ以外の場合、アプリケーションが構築され、OnStartup オーバーライドが呼び出されます。

Windows のバージョンによっては、メッセージ ボックスを上げると、既存のインスタンスも Z オーダーの先頭にプッシュされます。そうでない場合は、ウィンドウを一番上に移動することについて別の質問をすることができます。

Win32Api には、動作をさらにカスタマイズするのに役立つ追加機能があります。

このアプローチにより、目的のメッセージ通知が提供され、メイン ウィンドウのインスタンスが 1 つだけ作成されることが保証されます。

于 2013-08-16T12:07:41.573 に答える