3

我有一个可以通过命令行获取参数的 WPF 应用程序。我的应用程序不能重复(我将其设为单个实例),但我希望能够多次添加参数 - 并将它们添加到 runnig 应用程序中而无需打开另一个窗口。现在在我的代码中,我检查应用程序是否有另一个实例 - 如果有,我会抛出异常。我正在寻找一种能够多次运行以下脚本的方法:

Myapp.exe -firstname first -lastname last

并且每次运行的应用程序都会将插入的参数添加到其列表中。我该怎么做?

4

3 回答 3

2

您可以覆盖类的OnStartup方法App。请看这里。您将在方法的参数中找到命令行参数。请看这里

public class App : Application
{
    protected override OnStartup(StartupEventArgs e)
    {
        var cmdLineArgs = e.Args;
        // your logic here
    }
    // ...
}

由于您需要一些进程间通信机制,因此您可能应该阅读这篇SO 帖子。我认为创建 WCF 服务是最好的选择。

于 2013-03-13T13:33:05.367 回答
0

在执行检查应用程序是否为单一应用程序时 - 如果存在应用程序实例(重复调用) - 应用程序应该向用户发送错误消息。在这种情况下,您应该检查是否有命令行参数,如果有 - 只需发送 Close() 并返回命令而不显示任何错误消息。应用程序将从命令行获取参数并使用它们执行它知道的操作。

于 2013-03-18T14:06:47.077 回答
0

您可以使用 Application.Current.Shutdown() 来停止您的应用程序。如果在 OnStartup 中调用它,它可以附加在显示的窗口之前。

对于读取参数,您可以在任何地方使用 OnStartup 或 Environment.GetCommandLineArgs() 中的 e.Args。

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        // check if it is the first instance or not
        // do logic

        // get arguments
        var cmdLineArgs = e.Args;

        if (thisisnotthefirst)
        {
            // logic interprocess
            // do logic

            // exit this instance
            Application.Current.Shutdown();
            return;
        }

        base.OnStartup(e);
    }

    protected override void OnExit(ExitEventArgs e)
    {
        // may be some release needed for your single instance check

        base.OnExit(e);
    }
}

我不知道您如何检查单个实例,但我为此使用 Mutex:

    protected override void OnStartup(StartupEventArgs e)
    {
        Boolean createdNew;
        this.instanceMutex = new Mutex(true, "MySingleApplication", out createdNew);
        if (!createdNew)
        {
            this.instanceMutex = null;
            Application.Current.Shutdown();
            return;
        }

        base.OnStartup(e);
    }

    protected override void OnExit(ExitEventArgs e)
    {
        if (this.instanceMutex != null)
        {
            this.instanceMutex.ReleaseMutex();
        }

        base.OnExit(e);
    }

跳这会帮助你。

于 2013-03-18T14:36:01.053 回答