2016-08-08 26 views
0

Ich habe eine Anwendung, die nur eine Instanz pro Benutzersitzung ausführen darf. Wenn der Benutzer klickt, um die Anwendung erneut zu starten, möchte ich die bereits zum Fokussieren bringen. ich die Schritte in diesem Tutorial gefolgt WPF Single Instance ApplicationSo rufen Sie einzelne Instanzklasse von App.xaml.cs

und die Schritte in diesem Tutorial:

Schritt 1: die Datei SingleInstance.cs zu Ihrem Projekt hinzufügen.

Schritt 2: Fügen Sie einen Verweis zu Ihrem Projekt hinzu: System.Runtime.Remoting.

Schritt 3: Implementieren Sie Ihre Anwendungsklasse ISingleInstanceApp (definiert in SingleInstance.cs).

Die einzige Methode in dieser Schnittstelle ist:

ausblenden Code kopieren Bool SignalExternalCommandLineArgs (IList args) Diese Methode wird aufgerufen, wenn eine zweite Instanz Ihrer Anwendung auszuführen versucht. Es hat einen args-Parameter, der mit den Befehlszeilenargumenten übereinstimmt, die an die zweite Instanz übergeben werden.

Schritt 4: Definieren Sie Ihre eigene Hauptfunktion, die die Einzelinstanzklasse verwendet.

Sie sollte App-Klasse jetzt ähnlich wie diesen:

ausgeblendet Code kopieren /// Schritt 5: neuer Punkt Haupteintrag.

Wählen Sie Projekteigenschaften -> Anwendung und setzen Sie "Startobjekt" auf Ihren App-Klassennamen anstelle von "(Nicht gesetzt)".

Schritt 6: Brechen Sie die Standard-WPF-Hauptfunktion ab.

Klicken Sie mit der rechten Maustaste auf App.xaml, Eigenschaften, legen Sie Build Action auf "Seite" statt "Anwendungsdefinition" fest.

Ich bleibe bei Schritt 4 Ich weiß nicht, wie ich meine eigene Hauptfunktion definiere, die die Einzelinstanzklasse verwendet? jemand bitte helfen Sie mir, Dank

+0

Werfen Sie einen Blick auf [Meine Frage] (http://stackoverflow.com/questions/38473277/wpf-single-instance-window-clickonce-pass-arguments) und ignoriere den Parameter-Part – lokusking

Antwort

0

Okay, es ist so einfach hinzufügen, um dieses Verfahren zu Ihrer App.xaml.cs Datei in der App-Klasse:

[STAThread]  
public static void Main(string[] args) 
{ 
    if (SingleInstance<App>.InitializeAsFirstInstance("MyApp")) 
    { 
     var app = new App(); 
     app.InitializeComponent(); 
     app.Run(); 
     // Allow single instance code to perform cleanup operations 
     SingleInstance<App>.Cleanup(); 
    } 
} 
+0

GRADApp nicht akzeptiert, und es gibt eine rote Linie darunter warum? –

+0

Opps, ich vergesse es zu ändern, der Beitrag wurde aktualisiert. –

+0

wurde es in der blauen Farbe, aber hatte immer noch eine rote Linie darunter und der Fehler sagt "der Typ der MyApp.App kann nicht als Typparameter verwendet werden TApplication ist der generische Typ oder die Methode Microsoft.Shell.SingleInstance dort ist keine implizite Referenzkonvertierung von MyApp.App zu Microsoft.Shell.SingleInstanceApp –

-1
using System.Threading; 

[DllImport("user32.dll")] 
[return: MarshalAs(UnmanagedType.Bool)] 
static extern bool SetForegroundWindow(IntPtr hWnd); 

/// <summary> 
/// The main entry point for the application. 
/// </summary> 
[STAThread] 
static void Main() 
{ 
    bool createdNew = true; 
    using (Mutex mutex = new Mutex(true, "MyApplicationName", out createdNew)) 
    { 
     if (createdNew) 
     { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new MainForm()); 
     } 
     else 
     { 
     Process current = Process.GetCurrentProcess(); 
     foreach (Process process in Process.GetProcessesByName(current.ProcessName)) 
     { 
      if (process.Id != current.Id) 
      { 
       SetForegroundWindow(process.MainWindowHandle); 
       break; 
      } 
     } 
     } 
    } 
} 
+0

Application.Run (new MainWindow()); in meinem Code nicht akzeptieren, und der Fehler ist = ==> die beste überladene Methode für System.Windows.Forms.Application.Run (System.Windows.Forms.ApplicationContext hat dieselben ungültigen Argumente –

+0

Dies ist eine WinForms-Lösung. Nicht wirklich hilfreich für WPF – lokusking