2013-03-26 13 views
6

Chciałbym napisać aplikację C#, która przełączy się między niektórymi uruchomionymi aplikacjami. Powinien wykonywać dokładnie takie funkcje, jak Alt + Tab w oknach. Używam funkcji SetForegroundWindow() z Windows API, ale nie działa dobrze, jeśli aplikacja jest zminimalizowana na pasku zadań systemu Windows. Dodałem więc funkcję ShowWindow(), ale jest jeden problem, że nie można wyświetlić okna w oryginalnym rozmiarze ustawionym przez użytkownika.Przełączanie aplikacji w menedżerze zadań podobnym do C#

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

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

Przykład: Maksymalizuję okno, a następnie minimalizuję go na pasku zadań. Gdy zadzwonię:

ShowWindow(processWindowHandle, ShowWindowCmd.SW_NORMAL); 
WindowsApi.SetForegroundWindow(processWindowHandle); 

Okno nie jest zmaksymalizowane. Próbowałem grać z parametrem ShowWindowCmd.SW_NORMAL, ale z tym samym wynikiem.

+2

próbowałeś SW_RESTORE? – David

+0

Tak, próbowałem SW_RESTORE. Aplikacja, która została zminimalizowana, a następnie zminimalizowana, jest wyświetlana jako NIE zmaksymalizowana (zgodnie z oczekiwaniami). Jest wyświetlane jako okno, którego rozmiar jest mniejszy niż maksymalny rozmiar ekranu. –

+0

Nie chcę maksymalizować okna za każdym razem. Chcę pokazać okno w tym samym stanie, w którym chowałem okno innym lub zanim zminimalizowałem je na pasku zadań ... –

Odpowiedz

2

Zrobiłem to wcześniej, chcesz uzyskać listę wszystkiego, co otwarte, zminimalizować wszystko, a następnie powtórz to, ponownie porównując każdy program z tym, który chcesz przywrócić, a następnie przywróć go. Potrzebujesz sposobu, aby zidentyfikować jedno okno, które chcesz przywrócić, użyłem MainWindowTitle, ponieważ miałem kontrolę nad środowiskiem i dlatego mogłem zagwarantować, że każdy MainWindowTitle będzie wyjątkowy, możesz nie mieć tego luksusu.

Kod Kiedyś w przeszłości za to poniżej, to działa dobrze:

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

void SwitchDatabase(string mainWindowTitle) 
{ 
     try 
     { 
      bool launched = false; 

      Process[] processList = Process.GetProcesses(); 

      foreach (Process theProcess in processList) 
      { 
       ShowWindow(theProcess.MainWindowHandle, 2); 
      } 

      foreach (Process theProcess in processList) 
      { 
       if (theProcess.MainWindowTitle.ToUpper().Contains(mainWindowTitle.ToUpper())) 
       { 
        ShowWindow(theProcess.MainWindowHandle, 9); 
        launched = true; 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      ThrowStandardException(ex); 
     } 
} 
+0

Hmm. Masz rację, tak myślę. Jest tylko jedna mała wada. Jeśli nie zminimalizuję okna i nie wywołam tego kodu, to zmaksymalizowane okno zostanie przywrócone do NOT minimalizes a NOT maximalized size. Może powinien istnieć kod podobny do tego: 'if (zminimalizowany) { ShowWindow (theProcess.MainWindowHandle, 9); } else { SetForegroundWindow (processWindowHandle); } ' –

Powiązane problemy