2013-01-01 171 views
4

到目前爲止,我嘗試通過SendMessage和其他幾個調用使用GetThemePartSize,GetThemeMetric,GetSystemMetrics,WM_GETTITLEBARINFOEX,但沒有接近真正的維度(啓用了主題的Windows 7)。如何檢索窗口最小化,最大化和關閉按鈕的大小?

基本上我的問題是:如何獲得這些按鈕的大小(以及位置,理想情況下甚至是處理)以及GetThemePartSize的檢索值甚至意味着什麼?他們有什麼好處?

我已經看過this answer和其他很多,但他們根本不工作。

謝謝

更新

漢斯:

[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 
+0

你打算怎麼處理這些信息? – siride

+0

嗨,siride。問題一再在網上提出,但我找不到任何滿意的答案。另外,關於該主題的MSDN條目和API描述最好也是平庸的(儘管catch22.net對於較早的OS有一個很好的例子)。所以首先它是好奇心是什麼驅使我。我的個人目標是根據WPF演示應用程序中的可用空間,精確測量右上方菜單佔用的空間(在從左到右的系統上)並放置/隱藏/調整旁邊的控件大小。 – UnclePaul

+2

許多方法可能導致此代碼錯誤。沒人能看到它。當你甚至不指定你需要的語言時,避免詢問發送密碼的問題。張貼片段,以便這些事情變得明顯。 –

回答

1

您可以結合自定義鑲邊窗口庫修改或地址使用Microsoft.Windows.Shell.dll你的窗口按鈕。我使用這個以創建Windows 8的用戶界面風格的應用程序

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

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

+0

謝謝!會看看。 – UnclePaul

+1

我看了兩個框架,他們可能對他們的工作非常棒,但是如果我沒有弄錯,他們基本上會改變客戶區域,並改爲繪製/放置自己的按鈕。對於某些人來說,這可能確實是一種可能的解決方法,但是由於問題是關於如何訪問和計算單個按鈕的大小,我不能將其標記爲答案。無論如何+1,因爲這兩個項目都是用於玻璃上的航空工作的良好資源。 – UnclePaul

2

瀏覽火狐17.0.1的源代碼(即文件nsNativeThemeWin.cpp和nsUXThemeData.cpp)後,我能想出了在Vista或較新的滿足我的需求運行的桌面應用程序的部分解決方案:存儲在buttonsRect

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); 

的結果是有些奇怪:寬度迪菲rence(右 - 左== 105)恰好符合實際邊界,但是,高度差(29px)比按鈕實際佔用的區域大8個像素。

由於這並不能完全回答任何問題,所以我會將此線程留待進一步回覆。

再次感謝漢斯的寶貴意見和深思熟慮的評論。正如您可以清楚地看到的那樣,這完全是關於編程語言和代碼片段的。

相關問題