C# 在双屏幕设置上显示Winforms

C# 在双屏幕设置上显示Winforms,c#,winforms,C#,Winforms,我有一个C语言的winforms应用程序,大约有10个表单需要浏览 在所有这些屏幕上,我都将StartPosition设置为中心屏幕,但我使用的是一台插有第二个屏幕的笔记本电脑 现在,应用程序在我的一个屏幕上随机启动。此外,即使应用程序在一个屏幕上,消息框也会在第二个屏幕上弹出。如何将应用程序设置为始终在主屏幕上启动,在Windows中设置为1 我还想将应用程序绑定到它显示的屏幕,以便MessageBox与应用程序显示在同一屏幕上。我想做的另一件事是,新表单将显示在与以前表单相同的位置,而不是返

我有一个C语言的winforms应用程序,大约有10个表单需要浏览

在所有这些屏幕上,我都将StartPosition设置为中心屏幕,但我使用的是一台插有第二个屏幕的笔记本电脑

现在,应用程序在我的一个屏幕上随机启动。此外,即使应用程序在一个屏幕上,消息框也会在第二个屏幕上弹出。如何将应用程序设置为始终在主屏幕上启动,在Windows中设置为1


我还想将应用程序绑定到它显示的屏幕,以便MessageBox与应用程序显示在同一屏幕上。我想做的另一件事是,新表单将显示在与以前表单相同的位置,而不是返回到应用程序启动的屏幕

我应该使用什么来控制表单的位置

我尝试将StartPosition更改为CenterParent,但这似乎没有改变任何事情

在起始页第一个表单上尝试此操作:

更多信息请点击此处:

这个问题是关于在辅助屏幕上显示程序的。如果您使用了数组的答案,只需将数组的索引1更改为0即可

编辑:

为了强调布莱斯·瓦格纳对其他人的评论,请阅读以下问题:


如果您是从窗体或用户控件调用它,则需要调用MessageBox。请改为显示此消息


结合此处和类似问题中的所有答案,在主屏幕上显示应用程序的工作解决方案如下:

private void FormLogin_Load(object sender, EventArgs e)
    {
        this.Location = Screen.AllScreens[0].WorkingArea.Location;
        ReallyCenterToScreen();
     }
    protected void ReallyCenterToScreen()
    {
        Screen screen = Screen.FromControl(this);
        Rectangle workingArea = screen.WorkingArea;
        this.Location = new Point()
        {
            X = Math.Max(workingArea.X, workingArea.X + (workingArea.Width - this.Width) / 2),
            Y = Math.Max(workingArea.Y, workingArea.Y + (workingArea.Height - this.Height) / 2)
        };
    }
MessageBox.Show(this, "Message")
要使消息框保持在中央屏幕上,请执行以下操作:

private void FormLogin_Load(object sender, EventArgs e)
    {
        this.Location = Screen.AllScreens[0].WorkingArea.Location;
        ReallyCenterToScreen();
     }
    protected void ReallyCenterToScreen()
    {
        Screen screen = Screen.FromControl(this);
        Rectangle workingArea = screen.WorkingArea;
        this.Location = new Point()
        {
            X = Math.Max(workingArea.X, workingArea.X + (workingArea.Width - this.Width) / 2),
            Y = Math.Max(workingArea.Y, workingArea.Y + (workingArea.Height - this.Height) / 2)
        };
    }
MessageBox.Show(this, "Message")

来源包括@Bryce Wagner对我的问题的评论,@Mohamad Shahrestani的回答和@Sarsur的回答。A

我刚刚花了几个小时解决了一个类似的问题,我想分享一下我学到的东西。我有一台带第二个屏幕的笔记本电脑。Windows 10处于扩展模式。没有一个代码示例对忽略手动位置的对话框有帮助


事实证明,NVidia在其驱动程序中有一些有用的选项。其中一个将为您决定表单或对话框的位置。如果您的代码似乎不正常,请尝试“nView桌面管理器->Windows管理器->重新定位并打开Windows on设置”对话框。

打开消息框时,您是在指定iwin32窗口父级,还是在调用以消息文本开头的Show版本?因为如果有父窗口,您总是希望指定父窗口,这样它就会知道在哪里显示对话框;如果您是从窗体或用户控件调用它,则需要调用MessageBox。显示此,改为Message。谢谢,这解决了MessageBox的问题。我还希望将应用程序绑定到它显示的屏幕,以便MessageBox与应用程序显示在同一屏幕上。。。我希望Gimp团队足够关心这件事。你是说我应该把这段代码放在第一个表单中,或者放在每一个表单中?我想这对你有用。在MyForm_loads中使用,但使用哪种形式?每个表单,还是仅第一个表单?在问题的第一个表单中使用它u表示应用程序将在两个屏幕上随机启动。@TK-421如果这解决了您的问题,请评论或接受,我完成该操作