gpt4 book ai didi

c# - 为什么 DwmGetWindowAttribute 与 DWMWA_EXTENDED_FRAME_BOUNDS 在切换监视器时表现异常?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:06:39 38 4
gpt4 key购买 nike

当我的 WinForm 应用程序从主监视器移动到辅助监视器时,这些属性和 winapi 函数返回的边界(窗口的高度和宽度)值不会改变:

  • Form.Bounds
  • 表格.大小
  • GetWindowRect()

但是 DwmGetWindowAttributeDWMWA_EXTENDED_FRAME_BOUNDS 返回的值发生了巨大变化。

根据评论的建议进行编辑:例如,在主监视器中,DwmgetWindowAttribute 返回宽度和高度为 292, 100 的 rect 和其他值返回 306, 107。考虑到投影占用 7 个像素,这是连贯的。但是当窗口移动到辅助监视器时,DwmgetWindowAttribute 返回 437, 150 并且其他方法返回相同的 306, 107

事实上,我的两台显示器的分辨率都是 1920 * 1080(但如果重要的话,比例会有所不同)

问题:为什么会这样?是只有我遇到过类似的问题还是其他人遇到过类似的问题?最终我想计算投影大小。还有其他办法吗?

复制:

如果你想重现这个,创建一个 winform 项目。在构造函数中使用 AllocConsole() 分配控制台。为 LocationChanged 添加事件处理程序并将以下代码添加到事件处理程序:

private void AgentMainForm_LocationChanged(object sender, EventArgs e)
{
Console.WriteLine("bounds: {0}, {1}", Bounds.Width, Bounds.Height);
Console.WriteLine("Size: {0}, {1}", Size.Width, Size.Height);
Console.WriteLine("Window Rect: {0}, {1}", GetSizeWithShadow().Width, GetSizeWithShadow().Height);
Console.WriteLine("Window Rect: {0}, {1}", GetSizeWithoutShadow().Width, GetSizeWithoutShadow().Height);
}

[DllImport("user32.dll", SetLastError = true)]
public static extern bool GetWindowRect(IntPtr hwnd, out RECT lpRect);

[DllImport("dwmapi.dll")]
public static extern int DwmGetWindowAttribute(IntPtr hwnd, int dwAttribute, out RECT pvAttribute, int cbAttribute);

public Size GetSizeWithoutShadow()
{
RECT regionWithoutShadow;
IntPtr hWnd = this.Handle;
if (Environment.OSVersion.Version.Major < 6) //DwmGetWindowAttribute does not work in XP, compatible only from Vista
{
GetWindowRect(hWnd, out regionWithoutShadow);
}
else
{
if (DwmGetWindowAttribute(hWnd, DWMWA_EXTENDED_FRAME_BOUNDS, out regionWithoutShadow, Marshal.SizeOf(typeof(RECT))) != 0)
{
//Handle for failure
}
}

return new Size(regionWithoutShadow.right - regionWithoutShadow.left, regionWithoutShadow.bottom - regionWithoutShadow.top);
}

public Size GetSizeWithShadow()
{
RECT regionWithoutShadow;
IntPtr hWnd = this.Handle;

GetWindowRect(hWnd, out regionWithoutShadow);

return new Size(regionWithoutShadow.right - regionWithoutShadow.left, regionWithoutShadow.bottom - regionWithoutShadow.top);
}

[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
}

最佳答案

你得到这个答案是因为你的 DPI 比例在一台显示器上是 1.5 而在另一台显示器上是 1.0。可以使用 GetDpiForWindow 进行协调.

关于c# - 为什么 DwmGetWindowAttribute 与 DWMWA_EXTENDED_FRAME_BOUNDS 在切换监视器时表现异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49002910/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com