Obter o estado da janela de outro processo

Como obtenho o estado da janela ( maximized , minimized ) de outro processo em execução?

Eu tentei usando isso:

 Process[] procs = Process.GetProcesses(); foreach (Process proc in procs) { if (proc.ProcessName == "notepad") { MessageBox.Show(proc.StartInfo.WindowStyle.ToString()); } } 

Mas se o processo for Maximized ou Minimized , ele sempre retornará Normal .

Como consertar isto?

Você precisará usar o Win32 através de P / Invoke para verificar o estado de outra janela. Aqui está um código de amostra:

 static void Main(string[] args) { Process[] procs = Process.GetProcesses(); foreach (Process proc in procs) { if (proc.ProcessName == "notepad") { var placement = GetPlacement(proc.MainWindowHandle); MessageBox.Show(placement.showCmd.ToString()); } } } private static WINDOWPLACEMENT GetPlacement(IntPtr hwnd) { WINDOWPLACEMENT placement = new WINDOWPLACEMENT(); placement.length = Marshal.SizeOf(placement); GetWindowPlacement(hwnd, ref placement); return placement; } [DllImport("user32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] internal static extern bool GetWindowPlacement( IntPtr hWnd, ref WINDOWPLACEMENT lpwndpl); [Serializable] [StructLayout(LayoutKind.Sequential)] internal struct WINDOWPLACEMENT { public int length; public int flags; public ShowWindowCommands showCmd; public System.Drawing.Point ptMinPosition; public System.Drawing.Point ptMaxPosition; public System.Drawing.Rectangle rcNormalPosition; } internal enum ShowWindowCommands : int { Hide = 0, Normal = 1, Minimized = 2, Maximized = 3, } 

Definição cortesia de pinvoke.net.

Você está usando proc.StartInfo, que está incorreto. Não reflete o estilo da janela de tempo de execução do processo de destino. É apenas a informação de boot que você pode definir e, em seguida, pode ser passada para o processo quando ele é iniciado.

A assinatura do C # é:

 [DllImport("user32.dll", SetLastError=true)] static extern int GetWindowLong(IntPtr hWnd, int nIndex); 

Você precisa usar p / invoke e chamar GetWindowLong (hWnd, GWL_STYLE) e passar proc.MainWindowHandle como o parâmetro hWnd.

Você pode verificar se a janela está minimizada / maximizada fazendo algo como:

 int style = GetWindowLong(proc.MainWindowHandle, GWL_STYLE); if((style & WS_MAXIMIZE) == WS_MAXIMIZE) { //It's maximized } else if((style & WS_MINIMIZE) == WS_MINIMIZE) { //It's minimized } 

NOTA: Os valores para os sinalizadores (WS_MINIMIZE, etc), podem ser encontrados nesta página: http://www.pinvoke.net/default.aspx/user32.getwindowlong

Obrigado a Kakashi por apontar nosso erro ao testar o resultado.

Dois estados de janela (maximizado / minimizado) podem ser obtidos chamando WinAPI IsIconic () / IsZoomed () assim:

  [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool IsIconic(IntPtr hWnd); [DllImport("user32.dll")] public static extern bool ShowWindowAsync(IntPtr hWnd, ShowWindowCommands cmdShow); if (IsIconic(_helpWindow.MainWindowHandle)) { ShowWindowAsync(_helpWindow.MainWindowHandle, ShowWindowCommands.SW_RESTORE); } 

Definição de enum ShowWindowCommands e outras funções foram tiradas de http://www.PInvoke.net

No Windows PowerShell, você pode fazer isso seguindo o código:

 Add-Type -AssemblyName UIAutomationClient $prList = Get-Process -Name "" $prList | % { $ae = [System.Windows.Automation.AutomationElement]::FromHandle($_.MainWindowHandle) $wp = $ae.GetCurrentPattern([System.Windows.Automation.WindowPatternIdentifiers]::Pattern) echo "Window title: $($_.MainWindowTitle)" echo "Window visual state: $($wp.Current.WindowVisualState)" }