2012-03-28 2 views
0

Intention laufende Anwendung: Führen Sie eine einzelne Instanz eine WPF-Anwendung. Wenn eine neue Instanz gestartet wird, sollte die bereits laufende Instanz auf den Vordergrund gesetzt werden.Stellen Sie sicher, einzelne Instanz einer WPF-Anwendung: Schwierigkeit der Wiederherstellung die bereits in den Vordergrund

Während ich am meisten davon erreicht habe, stehe ich vor einem Problem, wenn die bereits laufende Anwendung in der Benachrichtigungsleiste sitzt. Der Code wird ohne Fehler ausgeführt, das Fenster & kann jedoch nicht in den Vordergrund zurückgesetzt werden. Code Snippet (C#):

[DllImport("user32.dll")] 
private static extern bool SetForegroundWindow(IntPtr hWnd); 

[DllImport("user32.dll")] 
private static extern bool IsIconic(IntPtr hWnd); 

[DllImport("user32.dll")] 
private static extern bool ShowWindow(IntPtr hWnd, int cmdShow); 

var currentProcess = Process.GetCurrentProcess(); 

string processName = currentProcess.ProcessName; 
Process[] instances = Process.GetProcessesByName(processName); 

if (instances.Length > 1) 
{ 
    foreach(var instance in instances) 
    { 
     if (!currentProcess.Id.Equals(instance.Id)) 
     { 
      IntPtr hWnd = instance.MainWindowHandle; 

      if (IsIconic(hWnd)) 
       ShowWindow(hWnd, SW_RESTORE); 

      SetForegroundWindow(hWnd); 
     } 
    } 
    currentProcess.Kill(); 
} 

Kann man darauf hinweisen, was mache ich falsch. Um es noch einmal zu wiederholen, es funktioniert in dem Fall, wenn das bereits laufende Fenster im maximierten Zustand ist, aber im Nachhinein. Es schlägt fehl, wenn das bereits laufende Fenster in das Benachrichtigungsfeld minimiert wird.

Dank

Antwort

0

Haben Sie sich vergewissert, dass Ihr Code die ShowWindow ausführt, wenn der bereits laufenden Prozess im Systray ist? Ich frage, weil ich nicht denke, dass IsIconic ist die richtige Funktion zu verwenden: Die documentation besagt, dass es "bestimmt, ob das angegebene Fenster minimiert ist". Wenn der Prozess im Systray ist, wird er nicht minimiert, er ist verborgen.

Ich denke, Sie sollten stattdessen IsWindowVisible verwenden.

Verwandte Themen