在辅助监视器上显示Windows窗体?

我试图在辅助监视器上设置Windows窗体,如下所示:

private void button1_Click(object sender, EventArgs e) { MatrixView n = new MatrixView(); Screen[] screens = Screen.AllScreens; setFormLocation(n, screens[1]); n.Show(); } private void setFormLocation(Form form, Screen screen) { // first method Rectangle bounds = screen.Bounds; form.SetBounds(bounds.X, bounds.Y, bounds.Width, bounds.Height); // second method //Point location = screen.Bounds.Location; //Size size = screen.Bounds.Size; //form.Left = location.X; //form.Top = location.Y; //form.Width = size.Width; //form.Height = size.Height; } 

边界的属性看起来是正确的,但是在我尝试的两种方法中,这会使主监视器上的表单最大化。 有任何想法吗?

尝试在您的SetFormLocation方法内将WindowStartUpLocation参数设置为“手动”。

 this.Location = Screen.AllScreens[1].WorkingArea.Location; 

这是表单引用。

@ Gengi的答案很简洁,效果很好。 如果窗口最大化,它不会移动窗口。 这段代码解决了这个问题(虽然我怀疑窗口的“正常”尺寸必须小于新的屏幕尺寸才能工作):

  void showOnScreen(int screenNumber) { Screen[] screens = Screen.AllScreens; if (screenNumber >= 0 && screenNumber < screens.Length) { bool maximised = false; if (WindowState == FormWindowState.Maximized) { WindowState = FormWindowState.Normal; maximised = true; } Location = screens[screenNumber].WorkingArea.Location; if (maximised) { WindowState = FormWindowState.Maximized; } } } 

你确定screens[1]是你的第二? 给screens[0]一个尝试。 你的代码基本上是正确的。


好的,我查过了,你必须在Show()之后做:

 n.Show(); setFormLocation(n, screens[1]); 

这会产生一些不必要的闪烁。 但是你可以这样做:

 n.SetBounds(-100, -100, 10, 10); // or similar n.Show(); setFormLocation(n, screens[1]); 

要在辅助屏幕上显示表单:

  Screen primaryFormScreen = Screen.FromControl(primaryForm); //Use this if you are looking for secondary screen that is not primary Screen secondaryFormScreen = Screen.AllScreens.FirstOrDefault(s => !s.Primary) ?? primaryFormScreen; //Use this if you are looking for screen that is not being used by specific form Screen secondaryFormScreen = Screen.AllScreens.FirstOrDefault(s => !s.Equals(primaryFormScreen)) ?? primaryFormScreen; //Putting the form on the other screen secondaryForm.Left = secondaryFormScreen.Bounds.Width; secondaryForm.Top = secondaryFormScreen.Bounds.Height; //Recommended to use, You can change it back later to the settings you wish secondaryForm.StartPosition = FormStartPosition.Manual; secondaryForm.Location = secondaryFormScreen.Bounds.Location; Point p = new Point(secondaryFormScreen.Bounds.Location.X, secondaryFormScreen.Bounds.Location.Y); secondaryForm.Location = p; secondaryForm.Show(); 

如果您正在寻找特定的屏幕,您可以循环“Screen.AllScreens”并使用上述过程。

我用这个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); 

将窗体启动位置属性设置为手动

  public void MoveWindowToProjector () { Rectangle rectMonitor; // Create New Process Process objProcess = new Process(); //Get All the screens associated with this Monitor Screen[] screens = Screen.AllScreens; // Get Monitor Count int iMonitorCount = Screen.AllScreens.Length; // Get Parameters of Current Project string[] parametros = Environment.GetCommandLineArgs(); // if (parametros.Length > 0) // { //objProcess.StartInfo.FileName = parametros[0]; // objProcess.Start(); // } // Get Window Handle of this Form IntPtr hWnd = this.Handle; Thread.Sleep(1000); if (IsProjectorMode) { if (iMonitorCount > 1) // If monitor Count 2 or more { //Get the Dimension of the monitor rectMonitor = Screen.AllScreens[1].WorkingArea; } else { //Get the Dimension of the monitor rectMonitor = Screen.AllScreens[0].WorkingArea; } } else { rectMonitor = Screen.AllScreens[0].WorkingArea; } if (hWnd != IntPtr.Zero) { SetWindowPos(hWnd, 0, rectMonitor.Left, rectMonitor.Top, rectMonitor.Width, rectMonitor.Height, SWP_SHOWWINDOW); } } 
  Screen[] screens = Screen.AllScreens; sc aoc = new sc(); aoc.Show(); aoc.Location = Screen.AllScreens[INDEX OF YOUR AVAILABLE SCREENS TARGET].WorkingArea.Location; 

最大化窗口状态

 aoc.WindowState = FormWindowState.Maximized; 

任何X,Y位置

 aoc.Location = new Point(TARGET X POSITION, TARGET Y POSITION);