【问题标题】:Maximize form on both screens (dual screen monitor)在两个屏幕上最大化表单(双屏显示器)
【发布时间】:2011-03-22 15:09:44
【问题描述】:

我正在寻找有关以下问题的提示或解决方案。

我有一个在双屏环境中运行的 .NET 2.0 WinForm 对话框。工作区由 .NET Framework 设置以反映主屏幕。我想将表单最大化到两个屏幕,但是在单击“最大化按钮”后,对话框仅最大化到“活动”屏幕(活动是指当前放置对话框的屏幕)。

我对边界解决方案不感兴趣,这是可行的,但是当单击“最大化”按钮时,它会强制对话框返回 2 个屏幕之一。

如果有任何帮助或提示,我将不胜感激。

【问题讨论】:

    标签: c# .net multiple-monitors


    【解决方案1】:

    我知道这个帖子已经很老了 - 但在尝试了此处列出的每个解决方案并遇到问题后,我从 here 找到了一个非常有用且有效的解决方案。

    对我有用的是

    Rectangle r = new Rectangle();
            foreach (Screen s in Screen.AllScreens)
            {
                if (s != Screen.FromControl(this)) // Blackout only the secondary screens
                    r = Rectangle.Union(r, s.Bounds);
            }
    
            this.Top = r.Top;
            this.Left = r.Left;
            this.Width = r.Width;
            this.Height = r.Height;
    

    【讨论】:

    • 我不知道 if (s != Screen.FromControl(this)) 是为了什么(设置表格以覆盖所有显示器,无论有没有这个都适用于我),但谢谢先生!您刚刚帮我将双屏不同分辨率区域捕获添加到我自己的屏幕截图保护程序中 :)
    【解决方案2】:

    这可能会迟到,但这里有一个简单的方法。它通过获取分辨率的大小来设置表单的大小。然后它会放置表单以使其可见。

            int screenLeft = SystemInformation.VirtualScreen.Left;
            int screenTop = SystemInformation.VirtualScreen.Top;
            int screenWidth = SystemInformation.VirtualScreen.Width;
            int screenHeight = SystemInformation.VirtualScreen.Height;            
    
            this.Size = new System.Drawing.Size(screenWidth, screenHeight);
            this.Location = new System.Drawing.Point(screenLeft, screenTop);
    

    【讨论】:

    • 帅哥,我通过将您的代码放在 Form1_Load() 的开始部分成功地在双显示器中最大化了我的窗口,谢谢
    【解决方案3】:

    结合 2 种屏幕尺寸并将您的表单设置为该分辨率。比如:

    int height = 0;
    int width = 0;
    foreach (screen in System.Windows.Forms.Screen.AllScreens)
    {
      //take smallest height
      height = (screen.Bounds.Height <= height) ? screen.Bounds.Height: height;
      width += screen.Bounds.Width;
    }
    
    Form1.Size = new System.Drawing.Size(width, height);
    

    要覆盖最大化按钮,您可以通过 WndProc 检查最大化事件

    const int WM_SYSCOMMAND= 0x0112;
    const int SC_MAXIMIZE= 0xF030;
    protected override void WndProc(ref Message m)
    {
        if(m.Msg==WM_SYSCOMMAND)
        {
            if((int)m.WParam==SC_MAXIMIZE)
            {
                MessageBox.Show("Maximized!!");
                return;
            }
        }
        base.WndProc (ref m);
    }
    

    或注册到表单的 Resize 事件(你应该检查它是调整大小还是最大化)(MSDN)

    【讨论】:

    • 是的...正是我要说的...我的场景是这样的: 1. 用户点击 MAXIMIZE 2. 表单最大化到两个屏幕 请注意 MAXIMIZE 操作会导致几件事,除了改变大小:1)固定位置(不能移动)2)固定大小(不能调整大小)3)最大化按钮响应“回滚到最后一个大小”动作我可以模拟1)和2)我不知道如何模拟3 ) (最大化按钮允许恢复到上次大小)等..
    • 另外,据我所知,它看起来不对。如果您有两个 640x480 的屏幕,您最终会得到一个大小为 1280x960 的表单。应该是 1280x480 或 640x960,具体取决于屏幕的设置方式。
    • 我假设主屏幕较小或相等,因此最大化在较大的(第二个屏幕)上显示较小的窗口。现在我假设用户有两个具有相同分辨率的屏幕
    • 固定高度(宽度只是有趣的)。如果您有两个具有 2 种不同分辨率的屏幕,那么最大化超过 2 个屏幕将是一个问题。
    • 很棒的代码,刚刚测试了第一个。您应该使用大于 0 的值初始化高度(例如整数的最大值)。问题是高度为 0 并且没有屏幕的高度会更低。所以高度仍然是0
    【解决方案4】:

    我知道的唯一解决方案是将边界与覆盖 Resize 事件结合使用。在处理程序中,您可以检查 WindowState 属性以查看表单是最大化还是最小化。如果最大化,请再次调整窗口大小,并将所有屏幕边界放在一起。

    我确实看到你想要的东西有问题。
    如果第二个屏幕比第一个小怎么办(反之亦然)...
    如果第二个屏幕位于第一个屏幕的对角线(例如左上角)怎么办(反之亦然)...
    会有看不到的部分!

    【讨论】:

    • 我现在假设它们的大小相同。我正在考虑运行您的解决方案,但如果我知道如何强制 MAXIMIZE 按钮显示其他字形,那就太好了
    【解决方案5】:

    让用户更改他们的 Windows 显示设置(或为他们更改)。

    例如,在 NVidia 卡上,默认的 Windows 行为称为“双视图”。如果您启用“水平跨度”,则最大化的窗口将开始按照您的描述运行。

    【讨论】:

    • 我正在寻找不是特定于卡的通用解决方案...一些应用程序(封闭源代码)按照我的描述工作,但我无法找到它们的原理...
    • 没有通用的解决方案。 Windows 本身最大化窗口以填满一台显示器。显卡供应商通过将两台物理显示器显示为一个大显示器来实现这一点。
    【解决方案6】:

    不要这样做。

    我们开始:行为由用户和操作系统定义。您不应忽视用户的意愿。

    通过一些硬件驱动程序可以实现屏幕的绑定(形成一个虚拟屏幕)(我想到了当前卡的 ATI,他们称之为 EyeFinity)。

    虽然我看到了它的意义——在大多数情况下,它打破了用户对程序行为方式的期望。我说,作为一个经常使用 3 个以上屏幕的人 ;) 就像:在所有屏幕上使用一个程序 ;) 我不希望那样 ;)

    【讨论】:

    • 用户请求了这样的功能!这就是为什么我正在为它寻求解决方案!
    • 这种建议的问题在于您没有足够的上下文来判断它是否合适。在很多情况下,应用程序作者需要对整个系统进行大量控制 - 它们不是您似乎想到的桌面/办公应用程序,而是信息亭和工业控制之类的东西。
    • 问题在于,如果需要,这甚至都不容易回答——这也是 MS 不包括它的一个原因。两个屏幕?您能否 100% 假设两者都是“并排”并且具有相同的尺寸/分辨率?如果不是 - 事情变得非常丑陋。工业控制可以使用 ATI Eyefinity / Nvidia 等价于使多个屏幕显示为操作系统的一个(因此问题不存在)或用户手动使窗口变大(这是我目前的主要承包商在 4大屏幕控制墙)。
    猜你喜欢
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 2019-01-25
    • 2013-08-20
    • 2020-09-09
    • 1970-01-01
    相关资源
    最近更新 更多