Запустить программу на втором мониторе?

Есть ли способ указать, на каком мониторе отображается приложение в Delphi или C++Builder?

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


person stukelly    schedule 15.10.2008    source источник


Ответы (6)


Сохраняйте положение окон перед закрытием программы и восстанавливайте их при запуске. Мультимониторные дисплеи просто увеличивают размер рабочего стола; другие поверхности монитора просто имеют другой участок той же плоскости X/Y с исходной точкой в ​​верхнем левом углу основного монитора.

Это можно сделать автоматически с помощью любого из нескольких компонентов.

Кстати, переменная Screen в модуле Forms имеет свойство MonitorCount и другое индексируемое свойство Monitors[Index: Integer]: TMonitor. TMonitor имеет свойства, указывающие на левое, верхнее, ширину, высоту и т. д., так что вся необходимая информация есть.

person Barry Kelly    schedule 15.10.2008
comment
Спасибо, я использовал Screen.MonitorCount, как вы и Джим предложили. - person stukelly; 17.10.2008
comment
Вы также должны проверить сохраненный монитор перед использованием настроек при запуске. В противном случае ваше окно вообще не будет отображаться на экране, если пользователь удалит монитор, который раньше был там. - person anon6439; 26.11.2008
comment
Всегда интересно запускать приложение с отрицательными координатами экрана, наблюдая за пользователями, как заставить приложение показывать... - person Jeroen Wiert Pluimers; 07.04.2010

Глобальный объект Screen (часть Forms) имеет концепцию мониторов. Я думаю, что это было добавлено примерно в Delphi 6 или 7. Будет работать следующий код:

// Put the form in the upper left corner of the 2nd monitor
//   if more then one monitor is present.
if Screen.MonitorCount > 1 then
begin
  Left := Screen.Monitors[1].Left;
  Top := Screen.Monitors[1].Top;
end;

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

person Jim McKeeth    schedule 15.10.2008

Не совсем тот ответ, который подразумевает ваш вопрос, но не могли бы вы сохранить настройки окна (размер, положение, максимальное состояние), когда приложение закрывается, а затем применять их при запуске?

person Nathen Silver    schedule 15.10.2008
comment
Это самая простая реализация - person benPearce; 16.10.2008
comment
Есть проблема с этим. Что произойдет, если второй монитор будет удален с компьютера после того, как приложение использовало его? (У MySql Query Brower есть эта проблема) - person Charles Faiga; 17.10.2008

Я сделал нечто подобное некоторое время назад в Delphi 5:

procedure TForm18.FormCreate(Sender: TObject);
var
  Mon: TMonitor;
  MonitorIdx: Integer;
begin
  MonitorIdx := 1; // better read from configuration
  if (MonitorIdx <> Monitor.MonitorNum) and (MonitorIdx < Screen.MonitorCount) then begin
    Mon := Screen.Monitors[MonitorIdx];
    Left := Left + Mon.Left - Monitor.Left;
    Top := Top + Mon.Top - Monitor.Top;
  end;
end;
person Uwe Raabe    schedule 16.10.2008

Windows позволит вам указать координаты окна в вызове API CreateWindow. Я недостаточно знаю Delphi или C++Builder, чтобы знать, есть ли у вас доступ к этой части процесса.

Вы также можете переместить окно в обработчике WM_CREATE.

EnumDisplayMonitors предоставит вам координаты каждого монитора в системе.


Очевидно, что в Delphi и C++ Builder есть средства, которые делают этот ответ несколько неуместным. Я оставлю его здесь на случай, если кто-то столкнется с этим вопросом, но ему нужен ответ для другой среды.

person Mark Ransom    schedule 15.10.2008
comment
В Delphi есть абстракции, охватывающие все эти функции, от сбора Screen.Monitors до событий перед созданием для управления положением формы. - person Barry Kelly; 16.10.2008

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

Возьмите ширину просматриваемого рабочего стола (оба монитора объединены), разделите ее пополам и сделайте это исходной позицией.

Вы также можете посмотреть, что API говорит вам о размерах monitor2.

person J.J.    schedule 15.10.2008
comment
Это будет работать, только если оба монитора имеют рабочий стол одинакового размера. - person Re0sless; 16.10.2008
comment
@ReOsless: Я. Как я уже сказал, это взлом. - person J.J.; 16.10.2008