2009-06-16 10 views

Respuesta

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

Tenga cuidado si planea usar la propiedad rcNormalPosition; los valores para Derecha e Inferior se almacenan en Ancho y Alto, lo que podría hacer que sus ventanas parezcan engañosamente grandes. – BrainSlugs83

5

No existe una "aplicación" minimizada. La mejor alternativa sería verificar si la ventana principal de la aplicación es icónica (minimizada).

IsIconic se puede utilizar para comprobar el estado icónico de una ventana. Devolverá 1 si se minimiza una ventana. Puede llamar a esto con process.MainWindowHandle.

+2

Para saber si una ventana está maximizada puede llamar a IsZoomed. – aquinas

+0

Sí, buena adición. –

1

En lugar de enumerar Procesos, debe usar el EnumWindows() function nativo y luego llamar a IsIconic.

+0

¿Por qué? Por cierto, EnumWindows era mi versión original, pero lo cambié a código administrado. – AngryHacker

+0

@AngryHacker: aún puede P/Invoke en EnumWindows. Eso es potencialmente mejor que tratar de usar el proceso, a menos que solo esté interesado en la ventana principal. Aún necesita P/Invoke para IsIconic (o GetWindowPlacement). –

+0

Todavía no estoy seguro de por qué EnumWindows es preferido? – AngryHacker

3

Si se minimiza una ventana (en Windows Forms al menos), ambos valores son Location.X y Location.Y -32000

+0

+1: Puede que esta no sea una solución perfectamente "limpia", pero sin duda es el truco. Pero debe tener en cuenta que las posiciones de las ventanas pueden ser negativas, incluso si no se minimizan, p. cuando una ventana está lamiendo el monitor. – McK

0

puede utilizar para isZoomed maximizada y IsIconic para reducir al mínimo mediante la inyección de DLL user32

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