2010-07-29 82 views
2

Iam寻找关于以下问题的一些提示或解决方案。在两个屏幕(双屏监视器)上最大化表单

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

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

我会为任何帮助或提示gratefull。

回答

0

不要这样做。

在这里我们去:行为是由用户和操作系统定义的。你不应该覆盖用户的愿望。一些硬件驱动程序(ATI出现在我的脑海中为目前的卡片,他们称之为EyeFinity)可能会结合屏幕(组成一个虚拟屏幕)。当我看到它的感觉 - 在大多数情况下,它打破了用户对程序行为方式的期望。我认为有人经常使用3 +以上的屏幕;)如:在所有屏幕上使用一个程序;)我不想要这样;)

+1

已经要求这样的功能与使用者!这就是Iam寻求解决方案的原因! – jodie 2010-07-29 09:57:50

+1

这种建议的问题在于你只是没有足够的上下文来知道它是否合适。应用程序作者需要对整个系统进行大量控制的情况很多 - 它们不是您似乎在考虑的桌面/办公应用程序,而是诸如信息亭和工业控制等。 – 2010-07-29 10:13:24

+0

问题是,这是不是很容易回答如果需要 - 这也是MS没有包括它的一个原因。两个屏幕?你能100%认为两者是“并排”并且具有相同的尺寸/分辨率吗?如果不是,事情变得非常难看。工业控制可以使用ATI Eyefinity/Nvidia使用ATI Eyefinity/Nvidia等效于使多个屏幕显示为OS(因此问题不存在)或用户手动调大窗口(这是我目前的主要承包商在4大屏幕控制墙)。 – TomTom 2010-07-29 13:16:36

4

结合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)

+0

是的......正是我要说...... 我的情况是这样的:1。 用户点击最大限度地提高 2.窗体最大化到两个屏幕 请注意,最大限度地提高操作导致几件事情,只是改变大小: 1)固定位置(不能移动) 2)固定大小(不能调整大小) 3)最大化按钮响应“回滚到最后尺寸”动作 正如我可以模拟1)和2)我不知道如何模拟3)(最大化按钮允许恢复到最后尺寸)等。 – jodie 2010-07-29 10:12:52

+0

Thx for WinAPI代码 - 我会尽快测试 – jodie 2010-07-29 10:13:39

+0

此外,据我所知,它看起来是错误的。如果您有两个640x480的屏幕,您最终将获得尺寸为1280x960的表单。取决于屏幕的设置,应该是1280x480或640x960。 – Svish 2010-07-29 10:15:27

0

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

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

+1

Iam寻找不是特定于卡片的通用解决方案...某些应用程序(封闭源代码)按照我描述的方式工作,但我无法找到它们的原理...... – jodie 2010-07-29 10:10:27

+0

没有通用的解决方案。 Windows本身最大化窗口来填充一台显示器。卡片供应商通过将两台物理监视器看作一个大型监视器来实现这一点 – 2010-07-29 10:21:31

0

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

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

+0

我现在假设他们是相同的大小。 Iam考虑运行你的解决方案,但它会很好如果我知道如何强制MAXIMIZE按钮来显示其他字形 – jodie 2010-07-29 10:25:04

4

这可能会很晚,但这是一个简单的方法。它通过获取分辨率的大小来设置表单的大小。然后它将表单放置以便可见。

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

酷男,我成功地将你的代码放在Form1_Load()的起始部分,使双窗口显示器的窗口最大化,谢谢 – 2014-10-02 07:14:39

+1

这对3台显示器来说也是完美的! – 2017-12-11 17:43:33

0

我知道这个线程是很老了 - 但我想,并具有与这里列出的每一个解决方案的问题之后找到了一个非常有用的工作液从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;