Как обеспечить отображение формы на "дополнительном" мониторе в сценарии с двумя мониторами?
У меня есть приложение, в котором есть форма, которую я хочу показать на втором экране.
Среднее Если приложение запущено на экране A, и когда я нажимаю на меню для отображения Формы, он должен отображаться на экране B
и то же самое, если приложение работает на экране B, и когда я нажимаю на меню для отображения формы, он должен отображаться на экране A.
Ответы
Ответ 1
Вам нужно использовать класс Screen
, чтобы найти экран, на котором оригинальная форма не включена, затем установите вторую форму Location
на основе этого экрана Bounds
.
Например:
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 видит один большой экран вместо двух меньших, и в этом случае это становится намного сложнее.
Ответ 2
Ниже приведена функция, позволяющая отображать форму на любом мониторе. Для вашего текущего сценария вы можете назвать это 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();
}
Примечание. Не забудьте сделать валидацию, чтобы убедиться, что у вас действительно есть два экрана и т.д., иначе будет создано исключение для доступа к sc[showOnMonitor]
Ответ 3
В методе 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;
}
Ответ 4
Я использовал это для приложения с двумя экранами XNA 4 (полноэкранное XNA Game Window + 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);