Windows 10屏幕坐标偏移7

Ste*_*zel 2 c++ windows gdi windows-10

我在Windows 10上使用C ++进行编码-直接Win32 API。

我想在屏幕的右上方显示一个窗口。在执行此操作时,我注意到最大化窗口的屏幕坐标为left = -8,top = -8,right = 1936,bottom = 1088。

另外,当我将窗口的位置设置为right = 1920且top = 0时,右侧大约有8个像素的间隙。我尝试移动窗口以查看得到的屏幕坐标。

对于非最大化窗口的rect.left可以从-7到1912年。

所以东西滑了7个像素?WTF Microsoft?

我应该如何提出rec.right = 1913的值来将窗口对齐到屏幕右侧而没有悬空间隙?

但是1920年的rect.right留下了空白。所以1912年的rect.right将留下更多的空白...

我需要一种可以在Vista上运行的解决方案。在win10之前,rect.right应该像您期望的那样为1920。

Whaaaaat会在这里吗?我要开始扔刀了!

在代码方面,这正是GetWindowRect正在报告的内容...(对不起,我的调试功能很奇怪)

::GetWindowRect (_wndo, r);

DBG("ExtRc l=`d r=`d t=`d b=`d w=`d h=`d",
r->left, r->right, r->top, r->bottom, r->right-r->left, r->bottom-r->top);
Run Code Online (Sandbox Code Playgroud)

Ste*_*zel 5

感谢@ChristopherOicles,这真的是他的答案。将其复制为您自己的(或进行调整,无论如何),我会接受您的。

发生的事情是微软破坏了Windows 10中的边框宽度。

GetWindowRect返回外部窗口坐标作为屏幕坐标。GetClientRect返回窗口内部的坐标。直到Windows 10(FU Win10 !!),

它们之间的宽度和高度的区别是边框的宽度和高度。

在win10上,边框宽度报告为16像素,因此侧面为8像素。但是,这些像素中只有1个可见。其中7个是透明的。因此,您的窗口在左侧,右侧和底部都有透明的7像素。

因此,如果要以编程方式在屏幕上对齐窗口,则需要考虑这些透明的7像素。用户不希望屏幕边框旁边有7像素的间隙!

具有属性DWMWA_EXTENDED_FRAME_BOUNDS的DwmGetWindowAttribute将为您提供屏幕坐标中边框的ACTUALLY SHOWING部分的宽度和高度。因此与GetWindowRect相似,但是rect不包含不可见性。

在大多数情况下,您仍将需要GetWindowRect来设置窗口的宽度和高度,并且需要每面7个像素的不可见性来以编程方式正确调整窗口的大小。

因此,使用rect GetWindowRect返回的.left和DwmTerribleName返回的.left之间的差值来获取7个像素的偏移量。

我认为,无论谁在微软这样做,都应该立即被枪杀。我不需要绕圈了。这破坏了与过去的兼容性。