winapi - GetWindowRect返回包含“不可見”邊框的大小




vb6 windows-10 (2)

我正在開發一個以網格樣式在屏幕上定位窗口的應用程序。 在Windows 10上運行時,窗口之間存在巨大差距。 進一步調查顯示, GetWindowRect 返回了意外的值,包括一個不可見的邊框,但我不能讓它返回帶有可見邊框的實際值。

1) 這個帖子 暗示這是設計的,你可以通過鏈接winver = 6來“修復”它。 我的環境不允許這樣但我已經嘗試將PE MajorOperatingSystemVersionMajorSubsystemVersion 更改為6而沒有任何影響

2)同一個線程還建議使用帶有 DWMWA_EXTENDED_FRAME_BOUNDS 從DWM獲取真實坐標,這有效,但意味著改變獲取窗口坐標的所有位置。 它也不允許設置值,讓我們反轉過程以便能夠設置窗口大小。

3) 這個問題 表明在這個過程中缺乏DPI意識。 既不在清單中設置DPI感知標誌,也不調用 SetProcessDpiAwareness 有任何結果。

4)一時興起,我還嘗試添加Windows Vista,7,8,8.1和10兼容性標誌,並且Windows主題清單沒有任何變化。

這個窗口移動到0x0,1280x1024,據說可以填滿整個屏幕,當查詢坐標時,我們得到相同的值。 然而,窗口實際上是14像素更窄,考慮到舊版Windows的邊框。

我怎樣才能說服Windows讓我使用真實的窗口坐標?


我怎樣才能說服Windows讓我使用真實的窗口坐標?

您已經在使用真實坐標。 Windows10只是選擇隱藏你眼睛的邊框。 但儘管如此,他們仍然存在。 將鼠標懸停在窗口邊緣後,光標將變為調整大小光標,這意味著它實際上仍在窗口上方。

如果您希望您的眼睛與Windows告訴您的相符,您可以嘗試使用Aero Lite主題公開這些邊框以便再次顯示它們:

http://winaero.com/blog/enable-the-hidden-aero-lite-theme-in-windows-10/


Windows 10在左側,右側和底部具有薄的不可見邊框,用於抓住鼠標以進行大小調整。 邊框可能如下所示: 7,0,7,7 (左,上,右,下)

當您調用 SetWindowPos 將窗口放在此坐標時:
0, 0, 1280, 1024

窗口將選擇那些精確的坐標, GetWindowRect 將返回相同的坐標。 但在視覺上,窗口似乎在這裡:
7, 0, 1273, 1017

你可以騙過窗戶告訴它去這裡:
-7, 0, 1287, 1031

為此,我們獲得Windows 10邊框厚度:

RECT rect, frame;
GetWindowRect(hwnd, &rect);
DwmGetWindowAttribute(hwnd, DWMWA_EXTENDED_FRAME_BOUNDS, &frame, sizeof(RECT));

//rect should be `0, 0, 1280, 1024`
//frame should be `7, 0, 1273, 1017`

RECT border;
border.left = frame.left - rect.left;
border.top = frame.top - rect.top;
border.right = rect.right - frame.right;
border.bottom = rect.bottom - frame.bottom;

//border should be `7, 0, 7, 7`

然後像這樣偏移矩形:

rect.left -= border.left;
rect.top -= border.top;
rect.right += border.left + border.right;
rect.bottom += border.top + border.bottom;

//new rect should be `-7, 0, 1287, 1031`

除非有更簡單的解決方案!





dwm