Форум: "Основная";
Текущий архив: 2007.02.18;
Скачать: [xml.tar.bz2];
ВнизОтловить изменение числа мониторов. Проблема. Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.064 c