How do I ensure a form displays on the “additional” monitor in a dual monitor scenario? [duplicate]

我怕爱的太早我们不能终老 提交于 2019-11-26 15:25:09
SLaks

You need to use the Screen class to find a screen that the original form is not on, then set the second form's Location property based on that screen's Bounds.

For example:

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;

This will work for any number of screens.

Note that it is possible that the video card is configured so that Windows sees one large screen instead of two smaller ones, in which case this becomes much more difficult.

Below is a function allowing you to display a form on any monitor. For your current scenario you can call this showOnMonitor(1);.

Essentially you have to get screen information from Screen.AllScreens and then get the dimensions of each, then place your form where you need it

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

Note don't forget to do validation to ensure you actually have two screens etc else an exception will be thrown for accessing sc[showOnMonitor]

On the OnLoad method change the Location of the window.

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

I used this for an XNA 4 Dual Screen Application (Full Screen XNA Game Window + WinForm)

In the Form_Load() method, place the following code:

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);
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!