阻止应用运行两次,而是显示第一个窗口

本文关键字:显示 窗口 第一个 两次 应用 运行 | 更新日期: 2023-09-27 18:35:13

我有一个 wpf 应用程序,我必须使该应用程序只运行一次。一台计算机上不应有多个实例。

这是我在 App.xaml.cs 中的 OnStartup() 方法中的代码:

var runningProcess = GetAnotherAppInstanceIfExists();
            if (runningProcess != null)
            {
                HandleMultipleInstances(runningProcess);
                Environment.Exit(0);
            }
public Process GetAnotherAppInstanceIfExists()
    {
        var currentProcess = Process.GetCurrentProcess();
        var appProcesses = new List<string> { "myApp", "myApp.vshost" };
        var allProcesses = Process.GetProcesses();
        var myAppProcess = (from process in allProcesses
            where process.Id != currentProcess.Id && appProcesses.Contains(process.ProcessName)
            select process).FirstOrDefault();
        if (myAppProcess != null)
        {
            return currentProcess;
        }
        return myAppProcess;
    }
public void HandleMultipleInstances(Process runningProcess)
    {
        SetForegroundWindow(runningProcess.MainWindowHandle);
        ShowWindow(runningProcess.MainWindowHandle, SW_RESTORE);
    }

因此,该应用程序在第二次运行时不会打开新实例,这很棒。但是,我需要找到第一个实例并再次显示窗口(如果它被最小化)。这一行是针对此的:

ShowWindow(runningProcess.MainWindowHandle, SW_RESTORE);

而且它不起作用。我做错了什么?我在网上看了很多例子,我的代码和它们是一样的。

阻止应用运行两次,而是显示第一个窗口

首先将 App.xaml 文件的生成操作更改为 Page。然后,您可以在 App.xaml 中使用此代码片段.cs:

private static readonly Mutex Mutex = new Mutex(true, "put your unique value here or GUID");
    private static MainWindow _mainWindow;       
    [STAThread]
    static void Main()
    {
        if (Mutex.WaitOne(TimeSpan.Zero, true))
        {
            var app = new App();
            _mainWindow = new MainWindow();
            app.Run(_mainWindow);
            Mutex.ReleaseMutex();
        }
        else
        {
            //MessageBox.Show("You can only run one instance!");
            _mainWindow.WindowState = WindowState.Maximized;
        }
    }
对我来说

,解决方案是这样做:

App.xaml文件的构建操作更改为 Page。(右键单击该文件,然后properties => Build Action => 下拉列表到page

在 App.xaml.cs:

    private static readonly Mutex Mutex = new Mutex(true, "42ae83c2-03a0-472e-a2ea-41d69524a85b"); // GUI can be what you want !
    private static App _app;
    [STAThread]
    static void Main()
    {
        if (Mutex.WaitOne(TimeSpan.Zero, true))
        {
            _app = new App();
            _app.InitializeComponent();
            _app.Run();
            Mutex.ReleaseMutex();
        }
        else
        {
            //MessageBox.Show("You can only run one instance!");
            _app.MainWindow.WindowState = WindowState.Maximized;
        }
    }