Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.02.18;
Скачать: 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 вся ветка

Текущий архив: 2007.02.18;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.058 c
3-1164623047
Feds
2006-11-27 13:24
2007.02.18
Ошибка с проверкой на Null


10-1129189029
DmitryNekl
2005-10-13 11:37
2007.02.18
Открытие запароленного xls-файла


8-1145444606
hosco
2006-04-19 15:03
2007.02.18
Информация о видео-файле


4-1156503788
Чапаев
2006-08-25 15:03
2007.02.18
Имя домена


1-1166876720
i-am-vladko
2006-12-23 15:25
2007.02.18
кодировка