Вниз
Скачать: CL | DM;

Отловить изменение числа мониторов. Проблема.   Найти похожие ветки 

← →
DVM ©   (2006-12-27 16:12) [0]

Требуется отловить изменение числа мониторов. Если я делаю это примерно так:

procedure WMDisplayChange(var Message: TWMDisplayChange); message WM_DISPLAYCHANGE;

procedure TfrmMain.WMDisplayChange(var Message: TWMDisplayChange);
var
 h: THandle;
begin
 inherited;
 UpdateMonitorsList;
end;

то на момент прихода сообщения количество мониторов в Screen.Monitors не соответствует действительности. И разрешения мониторов тоже.

Как победить?


← →
umbra ©   (2006-12-27 16:39) [1]

а почему WM_DISPLAYCHANGE должно свидетельствовать об изменении кол-ва мониторов?


← →
DVM ©   (2006-12-27 16:41) [2]


> umbra ©   (27.12.06 16:39) [1]

Потому что оно приходит при изменении числа мониторов.

Если оно не свидетельствует об изменении числа мониторов почему в момент его прихода свойства Width и Height у каждого из мониторов в Screen.Monitors содержат полный бред.


← →
umbra ©   (2006-12-27 16:49) [3]

в сдк написано, что оно приходит при изменении разрешения экрана. может это как-то и связано с кол-вом мониторов, но эта связь неочевидна


← →
DVM ©   (2006-12-27 17:01) [4]

Еще окну приходит WM_SETTINGCHANGE но если я читаю Screen.Monitors по его приходу, то и число мониторов там неправильное и разрешения их тоже неправильные.


← →
DVM ©   (2006-12-27 17:07) [5]

Что интересно, при создании новой формы объект Screen явно перечитывает список мониторов и их параметры. Если же форм не создается, то изменение количества мониторов не влияет на объект Screen.


← →
umbra ©   (2006-12-27 17:23) [6]

так почему бы не проверять этот список, по таймеру, например?


← →
clickmaker ©   (2006-12-27 17:28) [7]

может поотлавливать WM_DEVMODECHANGE или WM_DEVICECHANGE?


← →
DVM ©   (2006-12-27 17:42) [8]


> umbra ©   (27.12.06 17:23) [6]

В том то и дело по таймеру не получается. Если в приложении не создаются / удаляются новые формы список мониторов объект Screen не обновляет.

Вообще в модуле Forms объект Screen вызывает функцию EnumDisplayMonitors() только один раз - при своем создании.

Че то я так и не понял почему список мониторов обновляется при создании новой формы.


← →
DVM ©   (2006-12-27 17:50) [9]

У TScreen есть такое:

function TScreen.GetMonitorCount: Integer;
begin
 if FMonitors.Count = 0 then
   Result := GetSystemMetrics(SM_CMONITORS)
 else
   Result := FMonitors.Count;
end;

Глупость какая то. При создании он считывает количество мониторов и в дальнейшем перечитывает их количество только если его счетчик = 0.


← →
DVM ©   (2006-12-27 18:05) [10]


> umbra ©   (27.12.06 17:23) [6]


> так почему бы не проверять этот список, по таймеру, например?

Если Вы имеете ввиду перечитывать по таймеру не список Screen.Monitors а с пом EnumDisplayMonitors() тогда все ок. И даже не по таймеру а в обработчике WM_SETTINGCHANGE.

Screen.Monitors - никуда не годится.



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.026 c
15-1169854412
vasIzmax
2007-01-27 02:33
2007.02.18
О работе с датой


1-1166521793
atruhin
2006-12-19 12:49
2007.02.18
Определить отправителя при drag&drop


15-1169887107
$Pl@Sh
2007-01-27 11:38
2007.02.18
Новое на сайте


15-1170085729
SkySpeed
2007-01-29 18:48
2007.02.18
Подскажите - как настроить UserGate2.8 для разрешения только ICQ?


1-1166783436
STIK
2006-12-22 13:30
2007.02.18
Сохранение компоненты.




   Наверх