Отображение формы Windows на дополнительном мониторе?

Я пытаюсь установить Windows Form на вторичном мониторе, как показано ниже:

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; } 

Свойства границ кажутся правильными, но в обоих методах, которые я пробовал, это максимизирует форму на основном мониторе. Есть идеи?

Попробуйте установить параметр WindowStartUpLocation как «вручную» внутри вашего метода SetFormLocation.

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

это ссылка на форму.

@ Ответ Gengi является лаконичным и работает хорошо. Если окно максимизировано, окно не перемещается. Этот fragment решает это (хотя я подозреваю, что размеры окон «нормальные» должны быть меньше, чем новые размеры экрана, чтобы это работало):

  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 Dual Screen (полноэкранное 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); 

Установить форму Startup Position свойство в Manual

  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 POSITION

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

Я продолжаю получать ошибку ” не существует”

iphone error: expected ‘=’, ‘,’, ‘;’, ‘asm’ или ‘__attribute__’ перед ” foo ‘

Увеличение доступной памяти ожидается за счет добавления 1 ГБ ОЗУ к 32-битной системе 3Gb Vista

Android – как отменить регистрацию получателя, созданного в манифесте?

Как исправить «Определения функций не разрешены в подсказке или в сценариях»

Очистить кэш в приложении Android программно

Экранирование% в именах файлов / папок в командной строке

Как определить настраиваемые переменные конфигурации в рельсах

Как конвертировать секунды в HH: MM: SS с использованием T-SQL

Литеральный xyz типа int вне диапазона

Извлечение координат маркера из встроенной карты google

Что мне делать при запуске приложения триггеров, повторяющих бесконечный самозапуск установщика Windows?

Как преобразовать данные XML в data.frame?

Как вы уничтожаете файл и сохраняете файл .gz?

Как отправить параметры из уведомления об уведомлении на мероприятие?

Давайте будем гением компьютера.