13

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

私はこれを使って試しました:

Process[] procs = Process.GetProcesses();

        foreach (Process proc in procs)
        {

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

            }
        }

しかし、プロセスがMaximizedorの場合Minimized、それは を返しますNormal

これを修正する方法は?

4

4 に答える 4

27

別のウィンドウの状態を確認するには、P/Invoke を介して Win32 を使用する必要があります。サンプルコードは次のとおりです。

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 の厚意によるものです。

于 2012-06-16T16:23:30.103 に答える
7

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

C# の署名は次のとおりです。

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

p/invoke を使用して GetWindowLong(hWnd, GWL_STYLE) を呼び出し、proc.MainWindowHandle を hWnd パラメータとして渡す必要があります。

次のようにして、ウィンドウが最小化/最大化されているかどうかを確認できます。

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

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

于 2012-06-16T16:19:35.707 に答える