スクリーン上でのウィンドウクライアント領域の取得


Win32 API を用いると他のアプリケーションのウィンドウやクライアント領域を取得することができます。

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool GetClientRect(IntPtr hWnd, out RECT lpRect);

[StructLayout(LayoutKind.Sequential)]
private struct RECT
{
	public int Left;
	public int Top;
	public int Right;
	public int Bottom;
}

GetClientRect 関数では左上端の座標は常に (0, 0) です。ウィンドウの枠やキャプションバーを除いたクライアント領域のスクリーン上での座標を得るにはウィンドウの四角形から枠を除いて取得することができる気がします。

普通のウィンドウでは枠は左右と下に同じ太さでついていて上にキャプションバーが付いているというスタイルなので,これを仮定すれば簡単にクライアント領域を取得できます。しかしこのようなインターフェイスを本当に仮定してよいのかはよくわかりません。もしかして別の方法でクライアント領域を取得する方法があるのでしょうか。