2009-06-16 9 views

risposta

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

Fai attenzione se prevedi di utilizzare la proprietà rcNormalPosition: i valori di Right e Bottom vengono invece archiviati in Larghezza e Altezza, il che potrebbe rendere le finestre apparentemente ingannevoli. – BrainSlugs83

5

Non esiste una "applicazione" minimizzata. L'alternativa migliore sarebbe quella di verificare se la finestra principale dell'applicazione è iconica (ridotta a icona).

IsIconic può essere utilizzato per verificare lo stato iconico di una finestra. Restituirà 1 se una finestra è ridotta a icona. Puoi chiamare questo con process.MainWindowHandle.

+2

Per sapere se una finestra è ingrandita, è possibile chiamare IsZoomed. – aquinas

+0

Sì, bella aggiunta. –

1

Invece di elencare i processi, è necessario utilizzare il codice nativo EnumWindows() function e quindi chiamare IsIconic.

+0

Perché? Btw, EnumWindows era la mia versione originale, ma l'ho modificata in codice gestito. – AngryHacker

+0

@AngryHacker: è ancora possibile P/Invoke in EnumWindows. È potenzialmente meglio che provare a utilizzare il processo, a meno che tu non sia interessato solo alla finestra principale. Hai ancora bisogno di P/Invoke per IsIconic (o GetWindowPlacement). –

+0

Non sono ancora chiaro perché è preferibile utilizzare EnumWindows? – AngryHacker

3

Se una finestra è ridotto al minimo (in Windows Form almeno) sia i valori Location.X e Location.Y sono -32.000

+0

+1: Questa potrebbe non essere una soluzione perfettamente "pulita", ma certamente fa il trucco. Ma dovresti sapere che le posizioni delle finestre possono essere negative anche se non sono minimizzate, ad es. quando una finestra sta girando il monitor. – McK

0

è possibile utilizzare IsZoomed per massimizzare e isIconic per ridurre al minimo iniettando user32 dll

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