2

いくつかのオプションのコマンドライン引数を取ることができるWPFアプリケーションがあります。

このアプリケーションもシングルインスタンスアプリケーションです(インスタンスがすでに開いている場合は、ミューテックスを使用してインスタンスを閉じます)。

しかし、私が望んでいるのは、何かがいくつかのcmd行引数を使用してアプリケーションを開こうとした場合、アプリケーションはそれらを使用して想定されていることを実行することです(私のアプリケーションでは、cmd行に基づいて異なるダイアログを開きます)。

これを達成する最も簡単な方法は何ですか?

psedoコードでここに私が探しているものがあります

protected override void OnStartup(StartupEventArgs e)
{
     bool mutexIsNew;
     using (System.Threading.Mutex m = 
            new System.Threading.Mutex(true, "MyApplication", out mutexIsNew))
     {
         //if this is not the first instance of the app
         if (!mutexIsNew)
         {
              //if there is some cmd line args  
              if (e.Args.Length > 0)
              {
                   //send the args to the older instance so it can handle them
                   SendToOtherInstance(e.Args);
                   //shutdown this new instance
                   Application.Current.Shutdown();
               }

         }
     }
     base.OnStartup(e);
}
4

4 に答える 4

3

Code Projectにはシングルインスタンスアプリの実装がたくさんありますが、実際にはそれらの多くが非常に多く、どれを使用するかを決めるのは難しいです...

私はいくつかの解決策を試しました、そして私はこれが本当に好きです。これにより、2番目のインスタンスに渡されたコマンドラインパラメーターを非常に簡単に傍受できます。

于 2010-12-27T20:11:36.333 に答える
1

WM_USERの範囲でWindowsメッセージを送信してみませんか。情報のマーシャリングを少し行う必要がありますが、GlobalAlloc、GlobalLockなどを使用すると非常に簡単に行うことができます。

于 2010-12-27T20:05:18.623 に答える
0

ロジックを逆にすることを検討することをお勧めします。すでに実行中のインスタンスを閉じて、新しいパラメータで再起動します。

于 2010-12-27T19:55:22.880 に答える
0

.net 4を使用している場合は、プロセス間通信用にメモリマップトファイルを検討することをお勧めします。2番目のインスタンスは、共有メモリにデータを書き込み、元のインスタンスに通知するようにシステムミューテックスを設定してから、シャットダウンすることができます。このメモリマップトファイルの概要を参照してください。

または、さらに簡単に、元のインスタンスによって常に監視されているフォルダー内の単純なテキストファイルにコマンドライン引数を記述します。元のインスタンスは新しいファイルを確認して処理し、削除します。このアプローチは、どのバージョンの.netでも機能し、テスト/デバッグが容易になります。

于 2010-12-27T20:06:21.930 に答える