如何确保在双监视器方案中“附加”监视器上显示表单?

时间:2010-04-01 14:30:32

标签: c# winforms multiple-monitors

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

平均值如果应用程序在屏幕A上运行,当我单击菜单以显示表格时,它应显示在屏幕B上  如果应用程序在屏幕B上运行,当我点击菜单显示表格时,它应显示在屏幕A上。

4 个答案:

答案 0 :(得分:42)

您需要使用Screen类来查找原始表单未打开的屏幕,然后根据该屏幕的Location设置第二个表单的Bounds属性。

例如:

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可以看到一个大屏幕,而不是两个较小的屏幕,在这种情况下,这会变得更加困难。

答案 1 :(得分:19)

以下是一个允许您在任何监视器上显示表单的功能。对于您当前的方案,您可以调用此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]

答案 2 :(得分:12)

在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;
}

答案 3 :(得分:1)

我将它用于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);