在两台显示器上最大化 WPF 窗口

2024-03-27

就像标题一样,我希望我的 WPF 在 2 个显示器上最大化(现在我的电脑有 2 个显示器)。 我设置

this.Width = System.Windows.Forms.Screen.AllScreens[0].Bounds.Width + System.Windows.Forms.Screen.AllScreens[1].Bounds.Width 

但它并不完整,有像图像一样的间隔。 我希望用户单击最大化按钮,然后窗口最大化 2 个监视器。 有人知道吗? 谢谢你们!

p/s:抱歉我的英语不好。


您需要找到点Left、Top、Height、Width并直接设置为您想要最大化的窗口

MonitorFromPoint
MonitorFromRect
MonitorFromWindow

为了完整起见,我首先介绍如何在指定监视器上最大化窗口的简单方法。

void Maximize(HWND hWnd, HMONITOR hMonitor)
{
    // access monitor info
    MONITORINFO monitorInfo = { sizeof(MONITORINFO) };
    GetMonitorInfo(hMonitor, &monitorInfo);

    // restore window to normal size if it is not yet
    ShowWindow(hWnd, SW_RESTORE);

    // move window to the monitor
    SetWindowPos(hWnd, nullptr, monitorInfo.rcMonitor.left, 
    monitorInfo.rcMonitor.top, 0, 0, SWP_NOZORDER | SWP_NOSIZE);

    // maximize window
    ShowWindow(hWnd, SW_MAXIMIZE);    
}

如果使用相同的输入窗口和相同的目标监视器多次调用函数,则闪烁会更加明显。当然,有人可能会争辩说,可以获得窗口的当前状态并避免调用该函数(或者如果检测到状态已经正确,则在函数中进行一些早期返回)。然而,这样的处理只会增加函数的复杂性。我在想是否不可能仅隐藏窗口并以某种方式在后台执行状态恢复,并且仅在最后显示窗口。但尝试注入一些 SetRender(hWnd, FALSE) 或 ShowWindow(SW_HIDE) 调用只会使输出变得更糟。经过一些测试,我发现更改最大化/正常窗口仅更改窗口样式中的一位(WS_MAXIMIZE),最后通过这些信息我得到了最终的良好解决方案:

void Maximize(HWND hWnd, HMONITOR hMonitor)
{
    // access monitor info
    MONITORINFO monitorInfo = { sizeof(MONITORINFO) };
    GetMonitorInfo(hMonitor, &monitorInfo);

    const LONG currStyles = GetWindowLong(hWnd, GWL_STYLE);
    SetWindowLong(hWnd, GWL_STYLE, currStyles | WS_MAXIMIZE);
    const auto rc = monitorInfo.rcMonitor;
    SetWindowPos(&CWnd::wndTop, rc.left, rc.top, rc.Width(), rc.Height(), 0);
}

就是这样。该函数按预期工作,即使调用多次,也不会出现闪烁。通过从窗口样式中删除 WS_MAXIMIZE 并使用正确的矩形信息调用 SetWindowPos,可以轻松更改该函数以将窗口恢复到正常大小。

        [DllImport("User32.dll")]
        private static extern IntPtr MonitorFromPoint([In]System.Drawing.Point pt, [In]uint dwFlags);

        //https://msdn.microsoft.com/en-us/library/windows/desktop/dn280510(v=vs.85).aspx
        [DllImport("Shcore.dll")]
        private static extern IntPtr GetDpiForMonitor([In]IntPtr hmonitor, [In]DpiType dpiType, [Out]out uint dpiX, [Out]out uint dpiY);

        public enum DpiType
        {
            Effective = 0,
            Angular = 1,
            Raw = 2,
        }

        /// <summary>
        /// POINT aka POINTAPI
        /// </summary>
        [StructLayout(LayoutKind.Sequential)]
        public struct POINT
        {
            /// <summary>
            /// x coordinate of point.
            /// </summary>
            public int x;
            /// <summary>
            /// y coordinate of point.
            /// </summary>
            public int y;

            /// <summary>
            /// Construct a point of coordinates (x,y).
            /// </summary>
            public POINT(int x, int y)
            {
                this.x = x;
                this.y = y;
            }
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct MINMAXINFO
        {
            public POINT ptReserved;
            public POINT ptMaxSize;
            public POINT ptMaxPosition;
            public POINT ptMinTrackSize;
            public POINT ptMaxTrackSize;
        };

        /// <summary>
        /// </summary>
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
        public class MONITORINFO
        {
            /// <summary>
            /// </summary>            
            public int cbSize = Marshal.SizeOf(typeof(MONITORINFO));

            /// <summary>
            /// </summary>            
            public RECT rcMonitor = new RECT();

            /// <summary>
            /// </summary>            
            public RECT rcWork = new RECT();

            /// <summary>
            /// </summary>            
            public int dwFlags = 0;
        }


        /// <summary> Win32 </summary>
        [StructLayout(LayoutKind.Sequential, Pack = 0)]
        public struct RECT
        {
            /// <summary> Win32 </summary>
            public int left;
            /// <summary> Win32 </summary>
            public int top;
            /// <summary> Win32 </summary>
            public int right;
            /// <summary> Win32 </summary>
            public int bottom;

            /// <summary> Win32 </summary>
            public static readonly RECT Empty = new RECT();

            /// <summary> Win32 </summary>
            public int Width
            {
                get { return Math.Abs(right - left); }  // Abs needed for BIDI OS
            }
            /// <summary> Win32 </summary>
            public int Height
            {
                get { return bottom - top; }
            }

            /// <summary> Win32 </summary>
            public RECT(int left, int top, int right, int bottom)
            {
                this.left = left;
                this.top = top;
                this.right = right;
                this.bottom = bottom;
            }


            /// <summary> Win32 </summary>
            public RECT(RECT rcSrc)
            {
                this.left = rcSrc.left;
                this.top = rcSrc.top;
                this.right = rcSrc.right;
                this.bottom = rcSrc.bottom;
            }

            /// <summary> Win32 </summary>
            public bool IsEmpty
            {
                get
                {
                    // BUGBUG : On Bidi OS (hebrew arabic) left > right
                    return left >= right || top >= bottom;
                }
            }
            /// <summary> Return a user friendly representation of this struct </summary>
            public override string ToString()
            {
                if (this == RECT.Empty) { return "RECT {Empty}"; }
                return "RECT { left : " + left + " / top : " + top + " / right : " + right + " / bottom : " + bottom + " }";
            }

            /// <summary> Determine if 2 RECT are equal (deep compare) </summary>
            public override bool Equals(object obj)
            {
                if (!(obj is Rect)) { return false; }
                return (this == (RECT)obj);
            }

            /// <summary>Return the HashCode for this struct (not garanteed to be unique)</summary>
            public override int GetHashCode()
            {
                return left.GetHashCode() + top.GetHashCode() + right.GetHashCode() + bottom.GetHashCode();
            }


            /// <summary> Determine if 2 RECT are equal (deep compare)</summary>
            public static bool operator ==(RECT rect1, RECT rect2)
            {
                return (rect1.left == rect2.left && rect1.top == rect2.top && rect1.right == rect2.right && rect1.bottom == rect2.bottom);
            }

            /// <summary> Determine if 2 RECT are different(deep compare)</summary>
            public static bool operator !=(RECT rect1, RECT rect2)
            {
                return !(rect1 == rect2);
            }


        }

        [DllImport("user32")]
        internal static extern bool GetMonitorInfo(IntPtr hMonitor, MONITORINFO lpmi);

         [DllImport("User32")]
    internal static extern IntPtr MonitorFromWindow(IntPtr handle, int flags);

链接:-http://msdn.microsoft.com/en-us/library/windows/desktop/dd145071%28v=vs.85%29.aspx http://msdn.microsoft.com/en-us/library/windows/desktop/dd145071%28v=vs.85%29.aspx http://blogs.msdn.com/b/oldnewthing/archive/2010/04/12/9994016.aspx http://blogs.msdn.com/b/oldnewthing/archive/2010/04/12/9994016.aspx

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在两台显示器上最大化 WPF 窗口 的相关文章

随机推荐

  • 什么是“一流”对象?

    在给定的编程语言中 什么时候对象或其他东西被称为 一流 为什么 它们与非它们的语言有何不同 当人们说 一切都是对象 就像在 Python 中 时 他们真的意味着 一切都是一流的 吗 简而言之 这意味着该对象的使用没有任何限制 它是一样的 任
  • zsh 更改提示输入颜色

    我想更改 zsh 中输入文本的颜色 我为每个命令键入的文本 示例 在user host gt ls 我想要ls 为黄色以从标准输出中脱颖而出 我知道我可以完成这个bash using export PS1 BIGreen u h w IYe
  • 以编程方式删除 AppWidget

    我最难弄清楚如何以编程方式删除主屏幕 AppWidget 即无需用户实际将其拖入垃圾箱 举个例子 考虑一个可以有多个帐户的应用程序 每个帐户有任意数量的小部件 一旦删除帐户 小部件也应该被删除 我尝试过遵循一个不起眼的例子http www
  • 自动对焦仅适用于页面刷新

    我有一个弹出窗口中的表单 我设置了自动对焦属性autofocus autofocus 但当表单加载时它不会聚焦 但是如果刷新页面它会聚焦 该表格被插入到div 表格样本 First Name
  • 从 AsyncTaskLoader 更新进度条?

    使用 AsyncTaskLoader 时 如何更新显示更新状态的进度条 通常 您会等待回调完成后删除 但是如何进行运行更新呢 您会让主线程 ui 在设置数据时轮询数据吗 编辑 我正在谈论异步任务加载器 看loader部分 这是课程链接 ht
  • 如何使用 vagrant 定义网络设置

    我在 vagrant 中运行 Ubuntu 这是 Vagrantfile Vagrantfile API syntax version Don t touch unless you know what you re doing VAGRAN
  • 如何将带有值的命令行参数传递给 Inno Setup 编译器,以便我可以在代码中使用它们?

    我有两种可能的构建选项 由于我不希望我的客户使用某些参数启动安装程序 因此我最好将它们传递给编译器并在我的代码中完成所有工作 假设我有变量UNION它可能有两个值 0 and 1 我必须在代码中分析该变量的值 并根据结果包含或不包含某些文件
  • Hibernate与oracle dblink的实现

    刚接触hibernate 有没有办法在hibernate上实现oracle dblink 例如select from tablename dblink在hql中使用 在 Oracle 中为 tablename dblink 创建 SYNON
  • phantomjs 支持 Bayeux 或 WebSockets 吗?

    只是简单的问题 因为我在文档中没有找到任何参考资料 只是一个简单的答案 PhantomJS 1 x 不支持 但 PhantomJS 2 确实支持 websockets PhantomJS 2 0 0 的 Modernizr 输出
  • 如果行数超过 15,则向表中插入与打开行数相等的行数

    My table id sum type 1 3 1 1 6 1 1 6 2 1 3 1 1 3 1 1 6 1 These 1 3 1 是空行 类型始终为 1 总和可以不同 These 1 6 2 是封闭的行 输入 1 sum 空行的总和
  • option.style.display =“none”在 safari 中不起作用[重复]

    这个问题在这里已经有答案了 这是我正在研究的示例 http jsfiddle net 4suwY 5 http jsfiddle net 4suwY 5 HTML
  • 如何从文本文件中只读取一项内容?

    我可以从文件中读入 并且可以通过更改 for 循环中的数字来更改给出的行数 但我不希望文件中的所有数字像这样并排显示 我需要它们全部随机地一一下降 public class Assignment2 public static void ma
  • Python Sklearn.Model_Selection 给出错误,无法导入梳

    我将 train test split 导入为 from sklearn model selection import train test split 并给出错误无法导入名称 comb 我使用的版本是 scipy 0 18 1 和 skl
  • Botconnector 不适用于自签名的 Nodejs 机器人

    我创建了一个简单的机器人 自签名 ssl 证书 显然这不适用于机器人连接器 几秒钟后 我从机器人收到以下错误 error code BadCertificate message An error occurred while sending
  • 获取用户 keycloak Not Found 异常

    我无法像示例中那样获得用户组 样品来自 看看我们的测试套件 例如 UserTest https github com keycloak keycloak blob 2 5 0 Final testsuite integration arqu
  • Winforms 中是否可以从 ListView 拖放到 TreeView?

    如果不可能的话 我还可以使用 2 个 TreeView 控件 我只是不会在第二个 TreeView 控件中具有层次结构 它就像某种存储库 任何代码示例或教程都会非常有帮助 ListView自然不支持拖放 但您可以使用少量代码启用它 http
  • 如何在cordova应用程序中创建两个离子模式?

    您好 在我的应用程序中 我已经有一个用于登录的离子模式 ionicModal fromTemplateUrl templates login html scope scope then function modal scope modal
  • 如何隔离Spring Boot应用程序Redis和Spring Boot会话全局Redis

    据我所知 spring boot和spring session为我们提供了一站式自动配置 但是当我的应用程序使用会话redis和应用程序缓存redis时 不是同一个redis服务器 我该如何配置呢 非常感谢您的回复 事实上 默认情况下 sp
  • OpenGL资源共享策略

    我正在创建一个类似 CAD 的应用程序 基于 Qt 它将是一个多文档界面 每个文档将包含大约 5 个视口 源自 QGLWidget 因此 我需要在整个应用程序中共享平面着色器 然后在每个文档 即 5 个视口 之间共享 3D 资源 存储为 V
  • 在两台显示器上最大化 WPF 窗口

    就像标题一样 我希望我的 WPF 在 2 个显示器上最大化 现在我的电脑有 2 个显示器 我设置 this Width System Windows Forms Screen AllScreens 0 Bounds Width System