某些窗口的Windows桌面坐标系已关闭

问题描述 投票:0回答:1

开发用于Windows的某些软件时遇到了一个问题,一个与在屏幕上移动窗口有关的问题。

[基本上,我发现特定的窗口将因此不遵循坐标系。我有一个函数,该函数需要一个窗口和一个比例,然后将该窗口放大到它可以达到的最大大小(以该比例),并且仍在监视器的工作区域内(不要越过边缘或任务栏)。

示例1:该函数按预期工作,将窗口(VSCode)调整为最大尺寸,以4:3表示,然后将其放置在屏幕的一角(使用SetWindowPos并输入0,0作为坐标)。

示例2:完全相同的功能在另一个窗口(Firefox)上运行,并且再次将其大小调整为4:3,并将其设置为0,0。但是,这一次您可以看到窗口不是完全在角落,确切地说是偏离了8个像素。如果我使用api调用获取窗口位置,则返回0,0,即使显然不是。如果我自己手动将其卡入角落,则它将返回-8,0。

我不知道出什么问题或如何解决。它总是在相同的窗口上发生,虽然不确定,但我认为这与窗口的标题栏类型有关。

我见过的唯一与此问题有关的人在这里:https://answers.microsoft.com/en-us/insider/forum/insider_wintp-insider_desktop/desktop-coordinate-system-is-broken/9e6fd9ab-6d27-45e0-bb55-4c868cd6ac45

不幸的是,他没有得到真正的答案,所以我回到正题。

因此,关于以某种方式将窗口连续设置为实际上在角落的想法?我通过尝试动态地找到一个窗口从拐角处偏移了多少来提出一些不可靠的解决方案,但这并不是我真正要依靠的东西。这只是Windows的错误,我被卡住了吗?

谢谢,如果您有任何疑问,请告诉我!

c# windows winapi dllimport setwindowpos
1个回答
0
投票

这是Windows系统的设计。

我很久以前也看到过类似的问题。

Windows 10在左侧,右侧和底部具有较细的看不见的边框,它用于握住鼠标以调整大小。边框可能看起来像这样:7,0,7,7(左,上,右,下)。

边框在Windows 10中是不可见的,因此窗口似乎放置在错误的位置。 Visual Studio IDE有其自己的工具窗口,当工具窗口停靠时,它不使用边框或自定义NC_PAINT。并且当其工具窗口处于浮动状态时,它将使用默认边框。

工作狂:

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`

有关更多信息,请参考@Barmak Shemirani's answer

类似情况:

Retrieve Window Size without Windows Shadows

GetWindowRect returns a size including “invisible” borders

注意:DwmGetWindowAttribute()返回物理坐标,但是GetWindowRect()返回逻辑坐标。因此,对于非DPI感知的应用程序,在屏幕上缩放到100%以外的任何值时,边框宽度将是错误的。

© www.soinside.com 2019 - 2024. All rights reserved.