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

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

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

您需要使用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; 

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

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

下面是一个允许您在任何监视器上显示表单的function。 对于您当前的场景,您可以调用此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(); } 

注意不要忘记进行validation以确保您实际上有两个屏幕等,否则将抛出exception以访问sc[showOnMonitor]

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

我用它来做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);