Запустить программу на втором мониторе? - PullRequest
19 голосов
/ 16 октября 2008

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

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

Ответы [ 7 ]

27 голосов
/ 16 октября 2008

Глобальный объект Screen (часть форм) имеет концепцию мониторов. Я думаю, что это было добавлено около 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;

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

23 голосов
/ 16 октября 2008

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

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

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

1 голос
/ 15 февраля 2011
procedure TMDIChild.btnShowMonClick(Sender: TObject);
begin
    if Screen.MonitorCount > 1 then
    begin
      FormShow.Left:=Screen.Monitors[1].Left;
      FormShow.Top:=Screen.Monitors[1].Top;
      FormShow.Width:=Screen.Monitors[1].Width;
      FormShow.Height:=Screen.Monitors[1].Height;
    end
    else
    begin
        FormShow.Show;
    end;
end;
1 голос
/ 16 октября 2008

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

0 голосов
/ 16 октября 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;
0 голосов
/ 16 октября 2008

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

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

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


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

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

Захватите ширину видимого рабочего стола (оба монитора вместе взятые), разделите его пополам и сделайте стартовую позицию.

Вы также можете посмотреть, что API сообщает вам размеры монитора 2.

...