如何检索窗口的最小化,最大化和closuresbutton的大小?

到目前为止,我尝试使用GetThemePartSize,GetThemeMetric,GetSystemMetrics,WM_GETTITLEBARINFOEX通过SendMessage和几个其他调用,但没有什么甚至接近真正的维度(启用主题的Windows 7)。

基本上我的问题是:如何获得这些button的大小(和位置,理想情况下,甚至处理),GetThemePartSize检索到的值甚至意味着什么? 他们有什么好处?

我已经看了这个答案和其他许多人,但他们根本不工作。

谢谢

更新

汉斯:

[DllImport("uxtheme", ExactSpelling=true)] private extern static Int32 GetThemePartSize(IntPtr hTheme, IntPtr hdc, WindowPart part, WindowPartState state, ref RECT pRect, ThemeSize eSize, out SIZE size); [StructLayout(LayoutKind.Sequential)] private struct RECT { public int left; public int top; public int right; public int bottom; } [StructLayout(LayoutKind.Sequential)] private struct SIZE { public int cx; public int cy; } private const int TS_TRUE = 1; private const int CBS_NORMAL = 1; private const int WP_CLOSEBUTTON = 18; private const string VSCLASS_WINDOW = "WINDOW"; /* inside a method */ var rect = new RECT {left = 0, right = 200, top = 0, bottom = 200}; var size = new SIZE(); var windowHandle = new WindowInteropHelper({MyWindow}).Handle; var theme = OpenThemeData(windowHandle, VSCLASS_WINDOW); GetThemePartSize(theme, null, WP_CLOSEBUTTON, CBS_NORMAL, ref rect, TS_TRUE, ref size); // result on w7 with default theme -> size.cx == 28, size.cy == 17 

在浏览Firefox 17.0.1源代码(即文件nsNativeThemeWin.cpp和nsUXThemeData.cpp)之后,我能够为在Vista或更新版本上运行的桌面应用提供部分解决方案,以满足我的需求:

 private const int DWMWA_CAPTION_BUTTON_BOUNDS = 5; [StructLayout(LayoutKind.Sequential)] public struct RECT { public int left; public int top; public int right; public int bottom; } [DllImport("dwmapi.dll")] public static extern int DwmGetWindowAttribute(IntPtr hwnd, int dwAttribute, out RECT pvAttribute, int cbAttribute); var windowHandle = new WindowInteropHelper(Main.Instance).Handle; var buttonsRect = new RECT(); var sizeButtonsRect = Marshal.SizeOf(buttonsRect); DwmGetWindowAttribute(windowHandle, DWMWA_CAPTION_BUTTON_BOUNDS, out buttonsRect, sizeButtonsRect); 

存储在buttonsRect中的结果有些奇怪:宽度差异(右 – 左== 105)恰好符合实际边界,但高度差(29px)比按钮实际占用的区域大8个像素。

由于这个问题没有完全回答任何问题,所以我将把这个问题留给进一步的答复。

再次感谢汉斯的宝贵和深思熟虑的评论。 正如您可以清楚地看到的,这完全是关于编程语言和代码片段的。

您可以将Microsoft.Windows.Shell.dll与自定义镶边窗口库结合使用来修改或寻址窗口按钮。 我正在使用这个为了创建Windows 8 UI风格的应用程序

http://www.codeproject.com/Articles/131515/WPF-Custom-Chrome-Library

http://archive.msdn.microsoft.com/WPFShell