如何将具有特定启动参数的 WPF 程序限制为仅一个实例

How to restrict WPF programs with specific startup parameters to only one instance

public partial class App : System.Windows.Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
        var args = e.Args;
        if(args.Length!=0)
        {
            if (args[0] == ("login"))
            {
                new LoginWindow().Show();//conduct the login procedure
            }
            if (args[0] == ("restart"))
            {
                new SmallPanelWindow(2).Show();
            }
        }
        else
        {
            Environment.SetEnvironmentVariable("WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS", "--proxy-server=\"direct://\"");
            new MainWindow().Show();//show mainwindow which is commonly used
        }
    }

当多次使用参数“login”调用程序时,如何确保 LoginWindow 一次只存在一个?(例如,windows TaskScheduler 中的不同触发器使用“login”调用程序)此外,启动主窗口不会受到影响。

您可以使用 Mutex 来确保一次只有一个进程可以打开 LoginWindow:

protected override void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);
    var args = e.Args;
    if (args.Length!=0)
    {
        if (args[0] == ("login"))
        {
            using (Mutex mutex = new Mutex(false, "8da112cb-a833-4c50-be53-79f31b2135ca"))
            {
                if (mutex.WaitOne(0, false))
                {
                    new LoginWindow().ShowDialog(); //conduct the login procedure
                }
                else
                {
                    Environment.Exit(0);
                }
            }
        }
        if (args[0] == ("restart"))
        {
            new SmallPanelWindow(2).Show();
        }
    }
    else
    {
        Environment.SetEnvironmentVariable("WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS", "--proxy-server=\"direct://\"");
        new MainWindow().Show();//show mainwindow which is commonly used
    }
}

根据您的要求,您可能希望将 SmallPanelWindow 的初始化移动到 using 语句中,但上面的示例代码应该给了您想法。