2009-06-16 3 views

ответ

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

Будьте осторожны, если вы планируете использовать свойство rcNormalPosition - значения для Right и Bottom сохраняются вместо этого в ширину и высоту, что может привести к тому, что ваши окна выглядят обманчиво большими. – BrainSlugs83

5

Существует не такая вещь, как минимизированное «приложение». Лучшей альтернативой было бы проверить, является ли главное окно приложения знаковым (сведено к минимуму).

IsIconic можно использовать для проверки состояния изображения в окне. Он вернет 1, если окно будет сведено к минимуму. Вы можете позвонить по телефону process.MainWindowHandle.

+2

Чтобы узнать, максимально ли выполнено окно, вы можете вызвать IsZoomed. – aquinas

+0

Да - приятное дополнение. –

1

Вместо перечисления процессов вы должны использовать родной EnumWindows() function, а затем вызвать IsIconic.

+0

Почему? Btw, EnumWindows была моей оригинальной версией, но я изменил ее на управляемый код. – AngryHacker

+0

@AngryHacker: Вы все еще можете P/Invoke в EnumWindows. Это потенциально лучше, чем пытаться использовать процесс, если только вас не интересует только главное окно. Вам все еще требуется P/Invoke для IsIconic (или GetWindowPlacement). –

+0

Я все еще не понимаю, почему EnumWindows предпочтительнее? – AngryHacker

3

Если окно свернуто (в Windows Forms, по крайней мере) и значения Location.X и Location.Y являются -32000

+0

+1: Это может быть не совсем «чистое» решение, но это, безусловно, делает трюк. Но вы должны знать, что позиции окна могут быть отрицательными, даже если они не минимизированы, например. когда окно выталкивает монитор. – McK

0

вы можете использовать isZoomed для максимального и isIconic для минимизированы путем введения user32 DLL

[DllImport("user32.dll")] 
[return: MarshalAs(UnmanagedType.Bool)] 
static extern bool IsIconic(IntPtr hWnd); 
[DllImport("user32.dll")] 
static extern bool IsZoomed(IntPtr hWnd); 
Смежные вопросы