Вопрос

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

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

Это было полезно?

Решение

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

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

Кстати, переменная Screen в блоке Forms имеет свойство MonitorCount и другое индексируемое свойство Monitors[Индекс:Целое число]:Монитор.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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top