От чего зависит монитор, на котором работает мое приложение? - PullRequest
77 голосов
/ 09 сентября 2008

Я использую Windows, и у меня есть два монитора.

Некоторые приложения всегда запускаются на моем основном мониторе, независимо от того, где они были, когда я их закрывал.

Другие всегда будут запускаться на дополнительном мониторе 1008 *, независимо от того, где они были, когда я их закрывал.

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

@ rp: У меня есть Ultramon, и я согласен, что он необходим, чтобы Microsoft купила его и включила в свою ОС. Но, как вы сказали, он не позволяет вам контролировать монитор по умолчанию, в который запускается программа.

Ответы [ 11 ]

55 голосов
/ 04 февраля 2009

Вот что я нашел. Если вы хотите, чтобы приложение открывалось на дополнительном мониторе по умолчанию, сделайте следующее:

1. Open the application.
2. Re-size the window so that it is not maximized or minimized.
3. Move the window to the monitor you want it to open on by default.
4. Close the application.  Do not re-size prior to closing.
5. Open the application.
   It should open on the monitor you just moved it to and closed it on.
6. Maximize the window.

Приложение теперь откроется на этом мониторе по умолчанию. Если вы хотите заменить его на другой монитор, просто повторите шаги 1-6.

44 голосов
/ 10 сентября 2008

Правильно написанные приложения Windows, которые хотят сохранить свое местоположение от запуска к запуску, сохранят результаты GetWindowPlacement() до выключения, а затем при запуске запустят SetWindowPlacement(), чтобы восстановить их положение.

Часто приложения сохраняют результаты GetWindowPlacement() в реестре как REG_BINARY для удобства использования.

Маршрут WINDOWPLACEMENT имеет много преимуществ по сравнению с другими методами:

  • Обрабатывает случай, когда разрешение экрана изменилось с момента последнего запуска: SetWindowPlacement() автоматически гарантирует, что окно не полностью за кадром
  • Сохраняет состояние (свернутое / развернутое), но также сохраняет восстановленный (нормальный) размер и положение
  • Правильно обрабатывает метрики рабочего стола, компенсируя положение панели задач и т. Д. (Т. Е. Использует «координаты рабочего пространства» вместо «экранных координат») - методы, основанные на сохранении координат экрана, могут страдать от проблемы «ходящих окон», когда окно будет всегда отображаться немного ниже, если у пользователя есть панель инструментов в верхней части экрана).

Наконец, программы, которые правильно обрабатывают восстановление окна, будут учитывать параметр nCmdShow, переданный из оболочки. Этот параметр устанавливается в ярлыке, запускающем приложение (Normal, Minimized, Maximize):

if(nCmdShow != SW_SHOWNORMAL)
    placement.showCmd = nCmdShow; //allow shortcut to override

Для приложений, отличных от Win32, важно быть уверенным, что метод, который вы используете для сохранения / восстановления положения окна, в конечном итоге использует тот же базовый вызов, в противном случае (например, проблема setBounds() / getBounds() в Java Swing) вы ' в конечном итоге мы напишем много дополнительного кода для повторной реализации функциональности, уже присутствующей в функциях WINDOWPLACEMENT.

10 голосов
/ 10 сентября 2008

Получить UltraMon. Быстро.

http://realtimesoft.com/ultramon/

Он не позволяет указать, на каком мониторе запускается приложение, но позволяет переместить приложение на другой монитор и сохранить его соотношение сторон без изменений одним щелчком мыши. Это очень удобная утилита.

Большинство программ начнутся с того места, где вы их оставили в последний раз. Поэтому, если у вас есть два монитора на работе, но только один дома, можно запустить ноутбук дома и не видеть приложений, запущенных на другом мониторе (которого сейчас нет). UltrMon также позволяет быстро и легко перемещать эти приложения-сироты на главный экран.

9 голосов
/ 18 сентября 2014

Это не совсем ответ на этот вопрос, но я имел дело с этой проблемой с помощью ярлыка Shift + Win + [left,right] arrow keys. С его помощью вы можете переместить текущее активное окно на другой монитор.

4 голосов
/ 10 сентября 2008

Я уверен, что основной монитор установлен по умолчанию. Если приложение было закодировано прилично, когда оно закрыто, оно запомнит, где оно было в последний раз, и снова откроется там, но, как вы заметили, это поведение не по умолчанию.

РЕДАКТИРОВАТЬ: Обычно я делаю это, чтобы сохранить местоположение в настройках приложения. При загрузке, если для них нет значения, по умолчанию используется центр экрана. При закрытии формы он записывает свою позицию. Таким образом, всякий раз, когда он открывается, он там, где он был последним. Однако я не знаю простого способа заставить его автоматически запускаться на втором мониторе.

- Кевин Фэйрчайлд

3 голосов
/ 16 сентября 2008

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

Например, пользователи ноутбуков часто меняют конфигурацию дисплея. При стыковке может быть второй монитор, который исчезает при отсоединении. Если пользователь закрывает приложение, которое было запущено на втором мониторе, и повторно открывает приложение, когда монитор отключен, восстановление окна в соответствии с предыдущими координатами полностью выведет его из экрана.

Чтобы выяснить, насколько велик дисплей на самом деле, посмотрите GetSystemMetrics.

2 голосов
/ 01 апреля 2009

Итак, у меня возникла эта проблема с Adobe Reader 9.0. Каким-то образом программа забыла открыть на моем правом мониторе и постоянно открывалась на моем левом мониторе. Большинство программ позволяют перетаскивать его, максимизировать экран, а затем закрыть его, и он запомнит. Что касается Adobe, мне пришлось перетащить его, а затем закрыть, прежде чем развернуть, чтобы Windows запомнила, какой экран открыть в следующий раз. Как только вы установите правильный монитор, вы можете развернуть его. Я думаю, что это глупо, так как почти все программы Windows запоминают это автоматически, не пытаясь найти способ запоминания XP.

1 голос
/ 07 июня 2012

Так что я согласен, что есть некоторые приложения, которые вы можете настроить для открытия на одном экране, развернув или развернув экран правой кнопкой мыши и переместив / изменив размеры, затем закройте и снова откройте. Однако есть другие, которые будут открываться только на главном экране.

Что я сделал для разрешения проблемы: установите монитор, на котором вы предпочитаете открывать упрямые приложения, в качестве монитора 1, а второй монитор - на 2, затем измените монитор 2 на основной - чтобы настройки рабочего стола и панель запуска остаются. Надеюсь это поможет.

0 голосов
/ 31 декабря 2014

Щелкните правой кнопкой мыши по ярлыку и выберите свойства. Убедитесь, что вы находитесь на вкладке «Ярлык». Выберите выпадающий список RUN и измените его на Maximized.

Это может помочь при запуске программы в полноэкранном режиме на основном мониторе.

0 голосов
/ 10 сентября 2008

Я заметил, что если я добавлю ярлык на рабочий стол на одном экране, на этом экране может появиться запущенное приложение (, если , это приложение не перемещается само по себе).

Это также относится к запуску вещей из Windows Explorer - если Explorer находится на одном экране, запущенное приложение выберет этот монитор для использования.

Опять же - я думаю, это когда запускаемое приложение указывает положение по умолчанию (управляемое Windows). Большинство приложений, похоже, каким-то образом переопределяют это поведение по умолчанию.

Простое окно, созданное так, сделает это:

hWnd = CreateWindow (windowClass, windowTitle, WS_VISIBLE | WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, SW_SHOW, CW_USEDEFAULT, 0, NULL, NULL, hInst, NULL);

...