Frage

Ich habe eine WPF -Anwendung, mit der einige optionale Befehlszeilenargumente eingehen können.

Diese Anwendung ist auch eine einzelne Instanzanwendung (mithilfe eines Mutex, um alle Instanzen zu schließen, wenn einer bereits geöffnet ist).

Was ich jedoch tun möchte, ist, wenn etwas versucht, die Anwendung mit einigen CMD -Linien -Argumenten zu öffnen, dass die Anwendung das tut, was sie mit diesen anfangen soll (in meiner Anwendung öffnet sie verschiedene Dialoge basierend auf der CMD -Linie).

Was ist der einfachste Weg, dies zu erreichen?

Im PSEDO -Code hier suche ich hier

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);
}
War es hilfreich?

Lösung

Es gibt viele Implementierungen von Einzelinstanz -Apps zum Codeprojekt. Tatsächlich gibt es so viele von ihnen, dass es schwer zu entscheiden ist, welche Sie möchten ...

Ich habe mehrere Lösungen ausprobiert und ich mag es sehr Dieses hier. Es macht es sehr einfach, Befehlszeilenparameter abzufangen, die an die zweite Instanz übergeben wurden.

Andere Tipps

Warum senden Sie nicht einfach eine Windows -Nachricht im Bereich WM_USER? Sie müssen die Informationen ein wenig marschieren, aber Sie können dies mit Globalalloc, GlobalLock usw. ganz einfach tun.

Möglicherweise möchten Sie in Betracht ziehen, die Logik umzukehren, dh. Schließen Sie die bereits laufende Instanz und starten Sie Ihre neuen Parameter erneut.

Wenn Sie .NET 4 verwenden, können Sie Speicherzuordnungsdateien für die Inter-Process-Kommunikation in Betracht ziehen. Die zweite Instanz könnte einige Daten in den gemeinsam genutzten Speicher schreiben, einen System-Mutex festlegen, um die ursprüngliche Instanz zu benachrichtigen, und dann heruntergefahren. Sieh dir das an Überblick von Speicher zugeordneten Dateien.

Oder schreiben Sie die Befehlszeilenargumente in einer einfachen Textdatei in einem Ordner, der immer von der ursprünglichen Instanz überwacht wird. In den ursprünglichen Instanzen wird die neue Datei vorgesehen, verarbeitet sie und löscht sie dann. Dieser Ansatz funktioniert mit jeder Version von .NET und wäre einfacher zu testen/zu debuggen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top