2009-06-16 9 views

Odpowiedz

11
[DllImport("user32.dll")] 
     [return: MarshalAs(UnmanagedType.Bool)] 
     static extern bool GetWindowPlacement(IntPtr hWnd, ref WINDOWPLACEMENT lpwndpl); 

    private struct WINDOWPLACEMENT { 
     public int length; 
     public int flags; 
     public int showCmd; 
     public System.Drawing.Point ptMinPosition; 
     public System.Drawing.Point ptMaxPosition; 
     public System.Drawing.Rectangle rcNormalPosition; 
    } 

if (p.MainWindowHandle != IntPtr.Zero) { 
    if (p.MainWindowTitle.Contains("Notepad")) { 
     WINDOWPLACEMENT placement = new WINDOWPLACEMENT(); 
     GetWindowPlacement(p.MainWindowHandle, ref placement); 
     switch (placement.showCmd) { 
      case 1: 
      Console.WriteLine("Normal"); 
      break; 
      case 2: 
      Console.WriteLine("Minimized"); 
      break; 
      case 3: 
      Console.WriteLine("Maximized"); 
      break; 
     } 
    }     
} 
+1

Należy zachować ostrożność, jeśli planowane jest użycie właściwości rcNormalPosition - wartości Right i Bottom są zapisywane w oknie Width i Height, co może sprawić, że okna będą wydawały się zwodniczo duże. – BrainSlugs83

5

Nie ma czegoś takiego jak zminimalizowana "aplikacja". Najlepszą opcją byłoby sprawdzenie, czy główne okno aplikacji jest ikoniczne (zminimalizowane).

IsIconic może być użyty do sprawdzenia stanu ikonicznego okna. Zwróci 1, jeśli okno jest zminimalizowane. Możesz zadzwonić pod numer process.MainWindowHandle.

+2

Aby dowiedzieć się, czy okno jest zmaksymalizowane, możesz zadzwonić do IsZoomed. – aquinas

+0

Tak - miłym dodatkiem. –

1

Zamiast wyliczać Procesy, należy użyć natywnego EnumWindows() function, a następnie wywołać IsIconic.

+0

Dlaczego? Btw, EnumWindows była moją oryginalną wersją, ale zmieniłem ją na kod zarządzany. – AngryHacker

+0

@AngryHacker: Wciąż możesz P/Invoke into EnumWindows. Jest to potencjalnie lepsze niż próba użycia procesu, chyba że interesuje Cię tylko główne okno. Nadal potrzebujesz P/Invoke dla IsIconic (lub GetWindowPlacement). –

+0

Nadal nie wiadomo, dlaczego preferowane jest EnumWindows? – AngryHacker

3

Jeśli okno jest zminimalizowane (w Windows Forms przynajmniej) zarówno wartości Location.X i Location.Y są -32000

+0

+1: To może nie być idealnie "czyste" rozwiązanie, ale na pewno działa. Należy jednak pamiętać, że pozycje okien mogą być ujemne, nawet jeśli nie są zminimalizowane, np. kiedy okno dociera do monitora. – McK

0

można użyć isZoomed dla Zmaksymalizowane i isIconic dla zminimalizowane poprzez wstrzyknięcie user32 dll

[DllImport("user32.dll")] 
[return: MarshalAs(UnmanagedType.Bool)] 
static extern bool IsIconic(IntPtr hWnd); 
[DllImport("user32.dll")] 
static extern bool IsZoomed(IntPtr hWnd); 
Powiązane problemy