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

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

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

3 ответа

Решение

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

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

  1. Когда приложение закрывается, запомните его границы прямо.
  2. Когда приложение запустится, установите его границы прямо на значение, которое было запомнено.
  3. Проверьте, содержится ли форма в прямоугольнике границ экрана. Если форма находится за пределами экрана, то, вероятно, пользователь удалил монитор или иным образом переставил свой экран. Переместите форму на ближайший монитор или основной монитор.
  4. Дополнительные нюансы необходимы, если окно можно развернуть. В этом случае запомните границы прямоугольника и укажите, будет ли приложение развернуто. Ваши друзья для этого GetWindowPlacement а также SetWindowPlacement,

Вы можете получить текущий монитор любой формы, используя 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;

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

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

Другие вопросы по тегам