Windows桌面坐标系肯定是关闭的windows
Windows desktop coordinate system is off for certain windows
我 运行 在为 windows 开发一些软件时遇到了一个问题,这个问题与在屏幕上移动 windows 有关。
基本上,我发现特定的 windows 将始终不遵循坐标系。我有一个函数,它接受 window 和一个比率,然后将 window 放大到它可以达到的最大大小(以该比率)并且仍然在监视器的工作区域内(不去在边缘或任务栏上)。
示例 1:该函数按预期工作,将 window(VSCode)的大小设为它在 4:3 中的最大大小,并将其放在屏幕(使用 SetWindowPos 并传入 0,0 作为坐标)。
示例 2:完全相同的函数是 运行 在不同的 window (Firefox) 上,它再次调整大小为 4:3 并设置为 0,0。但是,这次您可以看到 window 并不完全在角落里,准确地说是偏离了 8 个像素。如果我用 api 调用获取 window 位置,它 returns 0,0,即使它显然不是。如果我自己手动将它卡入角落,那么它 returns -8,0.
我不知道出了什么问题或如何解决它。它总是发生在同一个 windows 上,不太确定,但我认为这与 window 的标题栏类型有关。
不幸的是,他从未得到真正的答案,所以我回到原点。
那么,有没有什么方法可以始终如一地将 windows 设置为实际位于角落?我想出了一些简陋的解决方案,比如尝试动态地找到 window 从拐角处偏移了多少,但这并不是我真正想要依赖的东西。这只是 windows 的一个错误,我被卡住了吗?
谢谢,如有任何问题,请告诉我!
这是windows系统的设计。
很久以前看到过类似的问题
Windows 10 左、右、下都有细细的隐形边框,用来夹住鼠标调整大小。边框可能如下所示:7,0,7,7(左、上、右、下)。
边框在 Windows 10 中不可见,因此 window 似乎放错了位置。 Visual StudioIDE有自己的工具-windows,当工具-window停靠时,它不使用边框或自定义NC_PAINT
;当它的工具-window 浮动时,它使用默认边框。
解决方法:
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`
更多信息请参考。
相似案例:
Retrieve Window Size without Windows Shadows
注:DwmGetWindowAttribute()
returns物理坐标,但GetWindowRect()
returns逻辑坐标。因此,对于缩放到 100% 以外的任何屏幕上的非 DPI 感知应用程序,边框宽度将是错误的。
我 运行 在为 windows 开发一些软件时遇到了一个问题,这个问题与在屏幕上移动 windows 有关。
基本上,我发现特定的 windows 将始终不遵循坐标系。我有一个函数,它接受 window 和一个比率,然后将 window 放大到它可以达到的最大大小(以该比率)并且仍然在监视器的工作区域内(不去在边缘或任务栏上)。
示例 1:该函数按预期工作,将 window(VSCode)的大小设为它在 4:3 中的最大大小,并将其放在屏幕(使用 SetWindowPos 并传入 0,0 作为坐标)。
示例 2:完全相同的函数是 运行 在不同的 window (Firefox) 上,它再次调整大小为 4:3 并设置为 0,0。但是,这次您可以看到 window 并不完全在角落里,准确地说是偏离了 8 个像素。如果我用 api 调用获取 window 位置,它 returns 0,0,即使它显然不是。如果我自己手动将它卡入角落,那么它 returns -8,0.
我不知道出了什么问题或如何解决它。它总是发生在同一个 windows 上,不太确定,但我认为这与 window 的标题栏类型有关。
不幸的是,他从未得到真正的答案,所以我回到原点。
那么,有没有什么方法可以始终如一地将 windows 设置为实际位于角落?我想出了一些简陋的解决方案,比如尝试动态地找到 window 从拐角处偏移了多少,但这并不是我真正想要依赖的东西。这只是 windows 的一个错误,我被卡住了吗?
谢谢,如有任何问题,请告诉我!
这是windows系统的设计。
很久以前看到过类似的问题
Windows 10 左、右、下都有细细的隐形边框,用来夹住鼠标调整大小。边框可能如下所示:7,0,7,7(左、上、右、下)。
边框在 Windows 10 中不可见,因此 window 似乎放错了位置。 Visual StudioIDE有自己的工具-windows,当工具-window停靠时,它不使用边框或自定义NC_PAINT
;当它的工具-window 浮动时,它使用默认边框。
解决方法:
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`
更多信息请参考
相似案例:
Retrieve Window Size without Windows Shadows
注:DwmGetWindowAttribute()
returns物理坐标,但GetWindowRect()
returns逻辑坐标。因此,对于缩放到 100% 以外的任何屏幕上的非 DPI 感知应用程序,边框宽度将是错误的。