3

コマンドラインからパラメーターを取得できるWPFアプリケーションがあります。私のアプリケーションは複製できません(私はそれを単一のインスタンスにしました)が、パラメーターを数回追加できるようにしたいです-そして、別のウィンドウを開かずにそれらをrunnigアプリケーションに追加します。私のコードでは、アプリケーションに別のインスタンスがあるかどうかを確認し、ある場合は例外をスローします。次のスクリプトを数回実行できる方法を探しています。

Myapp.exe -firstname first -lastname last

そして、実行中のアプリケーションが挿入されたパラメータをそのリストに追加するたびに。どうすればいいですか?

4

3 に答える 3

2

クラスのOnStartupメソッドをオーバーライドできます。Appplsはここを見てください。コマンドライン引数は、メソッドのパラメーターにあります。plsはここを見てください。

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 に答える