Как определить, на каком экране / мониторе запущено приложение?
В многоэкранной системе я хотел бы, чтобы некоторые из моих приложений запомнили, на каком экране они в последний раз работали, и снова запустили на том же экране.
Как определить текущий экран / монитор, учитывая, что экраны могут иметь разное разрешение? Программы написаны на Delphi 2007.
3 ответа
VCL предоставляет эту информацию, например, через форму Monitor
имущество. Это типа TMonitor
который предоставляет различные свойства монитора: его номер, является ли он основным монитором, его границы и рабочие рамки и т. д.
Однако вы пытаетесь просто восстановить свою форму там, где она работала ранее. Я не думаю, что вам нужно помнить информацию о мониторе. Просто сделайте следующее:
- Когда приложение закрывается, запомните его границы прямо.
- Когда приложение запустится, установите его границы прямо на значение, которое было запомнено.
- Проверьте, содержится ли форма в прямоугольнике границ экрана. Если форма находится за пределами экрана, то, вероятно, пользователь удалил монитор или иным образом переставил свой экран. Переместите форму на ближайший монитор или основной монитор.
- Дополнительные нюансы необходимы, если окно можно развернуть. В этом случае запомните границы прямоугольника и укажите, будет ли приложение развернуто. Ваши друзья для этого
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 экрана, один из которых имеет другое разрешение. Если это не сработает, то мне, возможно, придется взглянуть на информацию о мониторе. В случае, если кому-то интересно, почему разрешение отличается, четвертый - проектор.