C# 我如何确保表单显示在";“附加”;双监视器场景中的监视器?

C# 我如何确保表单显示在";“附加”;双监视器场景中的监视器?,c#,winforms,multiple-monitors,C#,Winforms,Multiple Monitors,我有一个应用程序,其中有一个表单,我想在第二个屏幕上显示 意思是若应用程序在屏幕A上运行,当我点击菜单显示表单时,它应该显示在屏幕B上 如果应用程序在屏幕B上运行,当我单击菜单显示表单时,它应该显示在屏幕A上。下面是一个允许您在任何监视器上显示表单的功能。对于当前场景,您可以将其称为shownMonitor(1) 基本上,您必须从screen.AllScreens获取屏幕信息,然后获取每个屏幕的尺寸,然后将表单放在需要的地方 function void showOnMonitor(int sho

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

意思是若应用程序在屏幕A上运行,当我点击菜单显示表单时,它应该显示在屏幕B上
如果应用程序在屏幕B上运行,当我单击菜单显示表单时,它应该显示在屏幕A上。下面是一个允许您在任何监视器上显示表单的功能。对于当前场景,您可以将其称为shownMonitor(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[shownmonitor]

将引发异常。您需要使用该类查找原始表单未打开的屏幕,然后根据该屏幕的
边界设置第二个表单的
位置
属性

例如:

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

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

如果有三台显示器呢?该应用程序将仅在双屏上运行。你确定吗?当您的一个用户购买第三台显示器时会发生什么情况?如果在远程桌面上使用该应用程序会发生什么情况?我们将为用户提供双屏幕系统:)此问题(以及公认的答案)更具体,因此不是完全相同的问题。这两个问题是互补的。这仍然不能完全回答问题。它应该是f.Left=sc[shownMonitor].Bounds.Left;f、 Top=sc[shownMonitor].Bounds.Top;如果发起者表单不可用,我在Windows7上有两个屏幕设置为“扩展”。如果我使用您的代码,我的窗口将保持在第一个屏幕上,因为otherScreen.WorkingArea始终处于(0,0)状态;我不得不使用otherScreen.Bounds来移动第二个屏幕左上角的窗口。我说的对吗?更多:(s=>s!=myScreen)不起作用;我必须使用(s=>!s.Equals(myScreen))我必须设置
otherForm.StartPosition=FormStartPosition.Manual
,才能工作。你应该使用
Bounds
属性,正如@MarcoWhy不仅仅
this.Location=sc[shownmonitor].Bounds.Location
?是的,你也可以这样做。@Nap,如果我通过hdmi端口连接第二台显示器,您的代码是否有效?@M_Mogharrabi我可以使用vga和hdmi端口进行测试。