我通过使用
{top=0 bottom=393 left=7 right=393}
调用 DwmGetWindowAttribute
获得了 DWMWA_EXTENDED_FRAME_BOUNDS
,但无法理解为什么在窗口顶部可以看到 top=0
时会看到阴影。
如果
RECT
不包括它周围的阴影区域,顶部怎么可能是0呢?我认为它应该是相对于RECT
给出的GetWindowRect
,并且应该等于左边,即7。
如果坐标是相对于左上角的,为什么左边不为0?相对于什么坐标?
我能找到的最详细的参考资料位于 https://learn.microsoft.com/en-us/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute)
DWMWA_EXTENDED_FRAME_BOUNDS
与一起使用。检索屏幕空间中的扩展框架边界矩形。检索到的值的类型为DwmGetWindowAttribute
。RECT
关于 获取窗口的投影尺寸的一些有用的单词说:
请注意,扩展帧边界采用物理像素坐标,不受 Windows 缩放功能的影响。您可能需要转换回虚拟坐标,或将虚拟坐标转换为物理坐标以使它们匹配。
我想知道这是不是真的。
任何更详细的文件将不胜感激。
就我而言,窗口 RECT (GetWindowRect) 和窗口扩展框架边界 RECT (DwmGetWindowAttribute with DWMWA_EXTENDED_FRAME_BOUNDS) 是不同的。
根据 GetWindowRect 文档:
在 Windows Vista 及更高版本中,窗口矩形现在包括投影占据的区域。
调用 GetWindowRect 将有不同的行为,具体取决于窗口是否曾经显示过。如果窗口之前没有显示过,GetWindowRect 将不包括阴影区域。
要获取不包括投影的窗口边界,请使用 DwmGetWindowAttribute,并指定 DWMWA_EXTENDED_FRAME_BOUNDS。
如果坐标是相对于左上角的,为什么左边不为0?相对于什么坐标?
我建议您可以参考该帖子:https://github.com/dotnet/winforms/issues/4776
此行为是设计使然。
从字面上切换到边缘上 1 像素的非客户区域是行不通的,因为用鼠标抓住边缘太难了。因此,边缘上的非客户端空间量保留为 8 像素宽,但该空间的 7 像素现在是透明的。窗口的编程边缘现在与窗口的可见边缘处于不同的位置。
这是窗户侧面和底部的情况,但顶部边缘没有必要。