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

Dav*_*son 34 c# multiple-monitors winforms setbounds

我正在尝试在辅助监视器上设置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;
}
Run Code Online (Sandbox Code Playgroud)

边界的属性似乎是正确的,但在我尝试的两种方法中,这最大化了主监视器上的表单.有任何想法吗?

小智 45

this.Location = Screen.AllScreens[1].WorkingArea.Location;
Run Code Online (Sandbox Code Playgroud)

这是表单引用.

  • 然而,似乎它是由Window的监视器配置之外的其他一些标准排序的.我的主要例子是位置[1],而我的第二个监视器位于[0]. (2认同)

Ses*_*esh 30

尝试在SetFormLocation方法中将WindowStartUpLocation参数设置为"manual".

  • 从MSDN:"将WindowStartupLocation设置为Manual会导致窗口根据其Left和Top属性值定位.如果未指定Left或Top属性,则它们的值由Windows确定." http://msdn.microsoft.com/en-us/library/system.windows.window.windowstartuplocation.aspx (4认同)
  • 是的,做form.StartPosition = FormStartPosition.Manual; 做了伎俩.知道为什么吗? (2认同)
  • 如果您的表单最大化,您必须首先设置“this.WindowState = FormWindowState.Normal;”,然后将表单移动到其他屏幕 (2认同)

Ale*_*and 10

@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;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)