如何使用GetWindowRect获取不可调整大小的窗口的实际位置

时间:2015-12-30 10:42:57

标签: c# winapi

当我为不可调整大小(没有 WS_SIZEBOX )窗口调用 GetWindowRect()时,它不会给我正确的窗口位置。 我已经厌倦了添加WS_SIZEBOX。但是除非我改变了窗口的大小并将其重新调整大小,否则这也无效。

有没有办法找到正确的位置?

1 个答案:

答案 0 :(得分:1)

如果窗口是在没有 WS_SIZEBOX 的情况下创建的,则Windows 7上的

GetWindowRect 似乎不包括右侧和底部窗口边框(至少使用Aero主题)或其他名称 WS_THICKFRAME )样式。 问题出在Aero上,无论是否可以调整大小,窗口都有厚框。但 GetWindowRect 函数认为不可调整大小的窗口更薄。幸运的是,还有另一种方法可以使用DwmGetWindowAttribute()(After vista)

来获取窗口大小和位置
[DllImport(@"dwmapi.dll")]
private static extern int DwmGetWindowAttribute(IntPtr hwnd, int dwAttribute, out Rect pvAttribute, int cbAttribute);

public static bool GetWindowActualRect(IntPtr handle, out Rect rect) 
{
 const int DWMWA_EXTENDED_FRAME_BOUNDS = 9;
 int result = DwmGetWindowAttribute(handle, DWMWA_EXTENDED_FRAME_BOUNDS, out rect, Marshal.SizeOf(typeof(Rect)));

 return result >= 0;
}

来源:http://www.code4copy.com/csharp/post/getting-window-rect-using-handle-on-windows-8-and-other