当我为不可调整大小(没有 WS_SIZEBOX )窗口调用 GetWindowRect()时,它不会给我正确的窗口位置。 我已经厌倦了添加WS_SIZEBOX。但是除非我改变了窗口的大小并将其重新调整大小,否则这也无效。
有没有办法找到正确的位置?
答案 0 :(得分:1)
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