Подтвердить что ты не робот

Начать программу на втором мониторе?

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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;

Ответ 5

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

Ответ 6

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

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

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


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

Ответ 7

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

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

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