Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1167140545
Priest
2006-12-26 16:42
2007.02.18
Как перебрать все классы, присутвующие в пакете (Run-Time)


3-1162115979
аматор
2006-10-29 12:59
2007.02.18
free база


2-1170039213
givs
2007-01-29 05:53
2007.02.18
Пытаешься поместить его на форму выдает ошибку,


1-1166779471
Stanislav
2006-12-22 12:24
2007.02.18
Служба и Com порт


2-1170347053
Garacio
2007-02-01 19:24
2007.02.18
настройки Button





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский