Мое приложение Delphi-7 отображает:
Screen.DesktopWidth
Screen.DesktopHeight
Screen.Monitors[0].Width
Screen.Monitors[0].Height
и, если выбран второй монитор, также:
Screen.Monitors[1].Width
Screen.Monitors[1].Height
Когда приложение запущено на моем ПК с WinXP-Pro, я захожу в Панель управления/Дисплей/Настройки и меняю настройки второго монитора (добавляю или удаляю его).
Затем я нажимаю кнопку «Обновить», чтобы отобразить новые значения 4 (или 6) параметров, и происходит что-то неожиданное: Screen.DesktopWidth и Screen.DesktopHeight показывают правильные новые значения, но значения других 2 (или 4) параметров параметры очень неправильные.
Вроде Screen.Monitors[0].Width = 5586935 , а должно быть 1680 .
Существуют ли особые правила использования TScreen в Delphi 7?
Screen.GetMonitors
). Я предполагаю, что вы получаете правильные значения при перезапуске приложения, не так ли? И если я правильно это помню, возможно, Сертак где-то написал, что можно безопасно уничтожить экземплярScreen
и создать его снова. А раз так, то следующее должно обновить эти данныеScreen.Free; Screen := TScreen.Create(nil);
, но я действительно не знаю, насколько безопасно это действие. - person TLama   schedule 23.06.2012GetMonitorInfo
) не работает из-за не фактического дескриптора (и возвращает случайные значения). Похоже, проблема связана со списком мониторов (TScreen.FMonitors
), который кэшируется и не меняется (в любое время? Я должен посмотреть...). А пока попробуйте проверить значениеMonitor.Width
(безScreen
раньше, толькоMonitor.Width
). Это должно быть между прочим. обновить кэшированный списокScreen.Monitors
, если монитор, полученный вызовомMonitorFromWindow
, не содержится в этом списке. - person TLama   schedule 24.06.2012TTaskMessageDialog.DoOnDialogCreated
, вызываемый внутри цепочки вызововShowMessage
, получает информацию о мониторе, но у него есть два недостатка. Во-первых, он ничего не делает со спискомScreen.FMonitors
, который необходимо обновить, чтобы отразить изменения монитора (он просто локально получает информацию для себя), а во-вторых, будет слишком поздно (как бы вы хотели передать эти значения в функциюShowMessage
, даже если он будет обновлять список мониторов, вам придется вызывать его один раз для обновления изменений и второй раз для отображения текста с метриками). - person TLama   schedule 24.06.2012