Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Отловить изменение числа мониторов. Проблема. [D7, WinXP]


DVM ©   (2006-12-27 16:12:00) 

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

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

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

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

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


DVM   (2006-12-27 18:05:00) [1]


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


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

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

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


DVM   (2006-12-27 17:50:00) [2]

У 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 17:42:00) [3]


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

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

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

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


clickmaker   (2006-12-27 17:28:00) [4]

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


umbra   (2006-12-27 17:23:00) [5]

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


DVM   (2006-12-27 17:07:00) [6]

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


DVM   (2006-12-27 17:01:00) [7]

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


umbra   (2006-12-27 16:49:00) [8]

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


DVM   (2006-12-27 16:41:00) [9]


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

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

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


umbra   (2006-12-27 16:39:00) [10]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо