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

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

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

7 ответов


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

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

BTW, переменная экрана в блоке форм имеет свойство под названием MonitorCount и другое индексируемое свойство, мониторы[индекс: целое число]: TMonitor. TMonitor имеет свойства, указывающие на левый, верхний, ширину, высоту и т. д. так что вся информация, которая вам нужна, там.


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

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


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


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;

Я сделал аналогичную вещь некоторое время назад в 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;

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

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

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


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

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

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

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