Как я могу определить, на каком экране/мониторе работает приложение?

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

Как определить текущий экран/монитор, учитывая, что экраны могут иметь разное разрешение? Программы написаны на Delphi 2007.


person Rohit Gupta    schedule 29.06.2015    source источник
comment
Не забывайте, что приложение может работать на нескольких экранах. В прошлом я просто фиксировал местоположение и размер приложения, а также то, работает ли оно максимально - при запуске приложения просто восстанавливал размер и положение. Конечно, при запуске приложения вам нужно увидеть, будет ли результат отображаться на экране, чтобы, если они работают на экране, который больше не подключен, избежать запуска приложения с текущего рабочего стола.   -  person Gary Walker    schedule 29.06.2015
comment
Я также делаю именно то, что делает Гэри. Не нужно запоминать, на каком мониторе находится ваше окно, помните, где оно было.   -  person David Heffernan    schedule 29.06.2015
comment
Рассмотрите возможность использования Get/SetWindowPlacement. Это заботится о таких проблемах.   -  person Uli Gerhardt    schedule 29.06.2015


Ответы (3)


VCL предоставляет эту информацию, например, через свойство формы Monitor. Это тип TMonitor, который предоставляет различные свойства монитора: его номер, является ли он основной монитор, его границы и рабочие области и т.д.

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

  1. Когда приложение закрывается, помните о его границах.
  2. Когда приложение запустится, установите для его границ rect значение, которое было запомнено.
  3. Проверьте, содержится ли форма в пределах прямоугольника экрана. Если форма находится за пределами экрана, вероятно, пользователь удалил монитор или иным образом переставил свой экран. Переместите форму на ближайший или основной монитор.
  4. Дополнительные нюансы нужны, если окно можно развернуть. В этом случае помните о границах прямоугольника и о том, максимально ли развернуто приложение. Ваши друзья для этого GetWindowPlacement и SetWindowPlacement.
person David Heffernan    schedule 29.06.2015
comment
Я думаю, что Get/SetWindowPlacement — это то, что нужно, потому что он уже имеет дело с пунктом № 3. - person Uli Gerhardt; 29.06.2015

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

uses
  MultiMon;

...
...
...
var
 LMonitor : TMonitor;
 LMonitorInfo : TMonitorInfoEx;
begin
  ZeroMemory(@LMonitorInfo, SizeOf(LMonitorInfo));
  LMonitorInfo.cbSize := SizeOf(LMonitorInfo);
  LMonitor:=Screen.MonitorFromWindow(Self.Handle); //pass the handle of the form
  if not GetMonitorInfo(LMonitor.Handle, @LMonitorInfo) then
     RaiseLastOSError;
  ShowMessage(Format('The form is in the monitor Index %d - %s', [LMonitor.MonitorNum, LMonitorInfo.szDevice]));
end;
person RRUZ    schedule 29.06.2015

Дэвид был прав в том, что мне не нужна была информация монитора, чтобы делать то, что я пытался сделать. Только для документации. DeskTopWidth и DeskTopHeight определяют размер рабочего стола.

Я сейчас дома только с двумя экранами одинакового разрешения. Интересно будет посмотреть, что будет на работе, где у меня 4 экрана, 1 из которых разного разрешения. Если это не сработает, возможно, мне также придется просмотреть информацию Монитор. Если кому-то интересно, почему разрешение разное, четвертый — это проектор.

person Rohit Gupta    schedule 29.06.2015