最大化两个屏幕上的形式(双屏幕显示器)

时间:2010-07-29 09:52:27

标签: c# .net multiple-monitors

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

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

我对边界解决方案不感兴趣,这很有效,但是当点击最大化按钮时,它会强制对话框返回到2个屏幕中的一个。

我会感激任何帮助或提示。

6 个答案:

答案 0 :(得分:5)

合并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 :(得分:5)

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

        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);

答案 2 :(得分: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;

答案 3 :(得分:0)

不要这样做。

我们走了:行为是由用户和操作系统定义的。你不应该覆盖用户的意愿。

使用一些硬件驱动程序可以实现屏幕的粘合(形成一个虚拟屏幕)(ATI让我想起当前的卡片,他们称之为EyeFinity)。

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

答案 4 :(得分:0)

让用户更改其Windows显示设置(或为其更改)。

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

答案 5 :(得分:0)

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

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