2015-12-30 90 views
0

獲得非調整大小窗口的實際位置當我打電話GetWindowRect()用於非調整大小(無WS_SIZEBOX)窗口它不給我窗口的正確位置。 我累了添加WS_SIZEBOX。但是,除非我改變窗口的大小並重新調整大小,否則這也不起作用。如何API使用GetWindowRect API

有什麼方法可以獲得正確的位置嗎?

+0

GetWindowRect工作正常。你還沒有理解所有的細微差別。沒有repro,我們可以提供什麼細節?對於GetWindowRect, –

+0

與WS_SIZEBOX風格和沒有WS_SIZEBOX風格的窗口之間存在差異。如果窗口沒有WS_SIZEBOX風格,則GetWindowRect比具有WS_SIZEBOX風格的窗口返回小左,上,下,右。 如果你不相信我只是檢查它。 閱讀[this](http://stackoverflow.com/a/20027688/5555803)解釋。 –

+0

在Aero中使用的胖窗口邊框是一個非常重要的appcompat問題。 Windows故意謊報這個窗口矩形,並假裝一個窗口仍有2個像素邊框,以確保應用程序不會創建一個客戶區域太小而不適合內容的窗口。這個appcompat如何與這個問題相關是不可能的。 –

回答

0

GetWindowRect在Windows 7似乎不包括右側和底部窗框邊緣(至少Aero主題),如果窗口沒有WS_SIZEBOX(或另一名WS_THICKFRAME)樣式創建的。 問題是在航空,窗戶有厚框架,無論他們是否可以調整大小。但GetWindowRect函數認爲不可調整大小的窗口更薄。幸運的是,還有另外一種方法,通過使用DwmGetWindowAttribute()得到窗口的大小和位置(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

+0

請[編輯你的答案](http://stackoverflow.com/posts/34529130/edit)並描述問題中的核心問題,已經採取了哪些措施來解決問題,以及爲什麼這是一個解決方案。當你在它的時候,正確地格式化代碼。 – IInspectable

+0

謝謝@Inspectable。 –