2012-06-16 10 views
8

実行中の別のプロセスのウィンドウ状態(maximizedminimized)を取得するにはどうすればよいですか?別のプロセスのウィンドウ状態を取得する

Process[] procs = Process.GetProcesses(); 

     foreach (Process proc in procs) 
     { 

      if (proc.ProcessName == "notepad") 
      { 
       MessageBox.Show(proc.StartInfo.WindowStyle.ToString()); 

      } 
     } 

をしかし、プロセスがMaximizedMinimizedであれば、それは今までNormalを返します。

私はこれを使ってみましたと思います。

これを修正するにはどうすればよいですか?

答えて

17

別のウィンドウの状態を確認するには、Win32からP/Invokeを使用する必要があります。いくつかのサンプルコードを示します:

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, 
} 

定義の礼儀pinvoke.net。

+0

私の場合、 'showCmd'は常に元の値であり、' ShowWindow(showCmd!= 1) 'が呼ばれても同じままで、' GetWindowPlacement'は 'WINDOWPLACEMENT'構造体に' showCmd = 1'を返します。それは文字通り、窓が「置かれた」瞬間についてですか? –

+0

'System.Drawing'への参照を追加することを忘れないでください。 – LazerSharks

6

あなたはproc.StartInfoを使用していますが、これは間違っています。ターゲットプロセスのランタイムウィンドウスタイルは反映されません。これは設定できるスタートアップ情報であり、起動時にプロセスに渡すことができます。

C#の署名がある:

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

あなたはP/GetWindowLongを呼び出して、呼び出し(hWndは、GWL_STYLE)を使用し、及びのhWndパラメータとしてproc.MainWindowHandleを渡す必要があります。

ウィンドウが何かやっによって最大化/最小化されている場合は、確認することができ

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 
} 

注:フラグの値(WS_MINIMIZE、など)は、このページに記載されています。http://www.pinvoke.net/default.aspx/user32.getwindowlong

結果のテストでエラーを指摘してくれたKakashiに感謝します。

+1

はにのみ論理式を受け付けます。 'WS_MAXIMIZE'をチェックしたい場合は、' style'からスライスされた値がそれ自身であり、 '&'を使って '(style&WS_MAXIMIZE)== WS_MAXIMIZE'を実行します。 – Kakashi

+0

真。更新された答え。 –

+1

また、必要な '()'または '演算子 '&'を 'int'と 'bool'型のオペランドに適用することはできません – Kakashi

2

ウィンドウ国が(最大化/最小化)このようなWinAPIのIsIconic()/ IsZoomed()を呼び出すことによって得することができます2:列挙型ShowWindowCommandsや他の機能の

[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); 
    } 

定義はから採取したwww.PInvoke.net次のコードでこれを行うことができますのWindows PowerShellでは

0

:/ため/しばらく-if文というのC#.NETに忘れてはいけない

Add-Type -AssemblyName UIAutomationClient 
$prList = Get-Process -Name "<ProcessNamesWhichHaveWindow>" 
$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)" 
} 
+0

これはWindows 7以上でのみ動作します。 – Ladislav

関連する問題