【问题标题】:How do I ensure a form displays on the "additional" monitor in a dual monitor scenario? [duplicate]在双显示器方案中,如何确保表单显示在“附加”显示器上? [复制]
【发布时间】:2010-04-01 14:30:31
【问题描述】:

我有一个应用程序,其中有一个我想在第二个屏幕上显示的表单。

意味着如果应用程序正在屏幕 A 上运行,当我单击菜单以显示表单时,它应该显示在屏幕 B 上 如果应用程序在屏幕 B 上运行,并且当我单击菜单以显示表单时,它应该显示在屏幕 A 上。

【问题讨论】:

  • 如果有三台显示器呢?
  • 应用只能在双屏上运行。
  • 你确定吗?当您的一位用户购买第三台显示器时会发生什么?如果应用通过远程桌面使用会怎样?
  • 我们将为系统提供双屏仅供用户使用:)
  • 这个问题(和接受的答案)更具体,因此不是 stackoverflow.com/questions/1363374/… 的完全重复。这两个问题是互补的。

标签: c# winforms multiple-monitors


【解决方案1】:

您需要使用Screen 类找到原始表单不在的屏幕,然后根据该屏幕的Bounds 设置第二个表单的Location 属性。

例如:

var myScreen = Screen.FromControl(originalForm);
var otherScreen = Screen.AllScreens.FirstOrDefault(s => !s.Equals(myScreen)) 
               ?? myScreen;
otherForm.Left = otherScreen.WorkingArea.Left + 120;
otherForm.Top = otherScreen.WorkingArea.Top + 120;

这适用于任意数量的屏幕。

请注意,视频卡可能被配置为让 Windows 看到一个大屏幕而不是两个小屏幕,在这种情况下,这会变得更加困难。

【讨论】:

  • 如果发起人表格不可用??
  • 我在 Windows7 上将两个屏幕设置为“扩展”。如果我使用您的代码,我的窗口将保留在第一个屏幕上,因为 otherScreen.WorkingArea 始终位于 (0,0);我不得不使用 otherScreen.Bounds 来移动第二个屏幕左上角的窗口。我说的对吗?
  • 更多:(s => s != myScreen) 不起作用;我不得不使用 (s => !s.Equals(myScreen))
  • 我必须设置 otherForm.StartPosition = FormStartPosition.Manual 才能让它工作。
  • 您应该使用@Marco 所述的Bounds 属性
【解决方案2】:

以下是允许您在任何监视器上显示表单的功能。对于您当前的情况,您可以调用此showOnMonitor(1);。

基本上你必须从Screen.AllScreens 获取屏幕信息,然后获取每个的尺寸,然后将表单放在你需要的地方

function void showOnMonitor(int showOnMonitor) 
{ 
    Screen[] sc; 
    sc = Screen.AllScreens; 

    Form2 f = new Form2(); 

    f.FormBorderStyle = FormBorderStyle.None; 
    f.Left = sc[showOnMonitor].Bounds.Left; 
    f.Top = sc[showOnMonitor].Bounds.Top; 
    f.StartPosition = FormStartPosition.Manual; 

    f.Show(); 
}

注意不要忘记进行验证以确保您实际上有两个屏幕等,否则访问sc[showOnMonitor]会引发异常

【讨论】:

  • 这仍然没有完全回答问题。
  • 应该是 f.Left = sc[showOnMonitor].Bounds.Left; f.Top = sc[showOnMonitor].Bounds.Top;
【解决方案3】:

在 OnLoad 方法中更改窗口的位置。

protected void Form1_OnLoad(...) {
    showOnMonitor(1);
}

private void showOnMonitor(int showOnMonitor) 
{ 
    Screen[] sc; 
    sc = Screen.AllScreens; 
    if (showOnMonitor >= sc.Length) {
        showOnMonitor = 0;
    }

    this.StartPosition = FormStartPosition.Manual; 
    this.Location = new Point(sc[showOnMonitor].Bounds.Left, sc[showOnMonitor].Bounds.Top);
    // If you intend the form to be maximized, change it to normal then maximized.
    this.WindowState = FormWindowState.Normal;
    this.WindowState = FormWindowState.Maximized;
}

【讨论】:

  • 为什么不只是this.Location = sc[showOnMonitor].Bounds.Location?
  • 是的,你也可以这样做。
  • @Nap,如果我通过 hdmi 端口连接第二台显示器,您的代码是否有效?
  • @M_Mogharrabi 我能够使用 vga 和 hdmi 端口进行测试。
【解决方案4】:

我将它用于 XNA 4 双屏应用程序(全屏 XNA 游戏窗口 + WinForm)

在 Form_Load() 方法中,放置以下代码:

var primaryDisplay = Screen.AllScreens.ElementAtOrDefault(0);  
var extendedDisplay = Screen.AllScreens.FirstOrDefault(s => s != primaryDisplay) ?? primaryDisplay;

this.Left = extendedDisplay.WorkingArea.Left + (extendedDisplay.Bounds.Size.Width / 2) - (this.Size.Width / 2);
this.Top = extendedDisplay.WorkingArea.Top + (extendedDisplay.Bounds.Size.Height / 2) - (this.Size.Height / 2);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    • 2012-07-21
    • 1970-01-01
    • 2020-01-10
    相关资源
    最近更新 更多