Vasya Опубликовано 22 сентября, 2025 Опубликовано 22 сентября, 2025 (изменено) Приветствую товарищи! Каким образом на FMX сделать динамическую реакцию на изменение цветовой схемы Windows (светлая/тёмная)? В VCL это делалось через обработку WM_SETTINGCHANGE, но здесь же нет хендлеров... И как грамотно загружать саму схему? Кстати, может, кому пригодится - рамку окна можно менять с помощью https://github.com/HemulGM/WindowDarkMode. Но только рамку. Изменено 22 сентября, 2025 пользователем Vasya Цитата
0 Tumaso Опубликовано 22 сентября, 2025 Опубликовано 22 сентября, 2025 (изменено) Хендлер делается несложно, создаешь его и вешаешь свой обработчик сообщений type TMyForm = class(TForm) private {$IFDEF MSWINDOWS} // Сохраненный обработчик сообщений окна FPrevWndProc: TFNWndProc; // Установленный обработчик сообщений окна FWndProc: Pointer; // Обработчик сообщений окна procedure FormWndProc(var AMsg: Winapi.Messages.TMessage); {$ENDIF} protected {$IFDEF MSWINDOWS} procedure CreateHandle; override; {$ENDIF} end; {$IFDEF MSWINDOWS} procedure TMyForm.FormWndProc(var AMsg: Winapi.Messages.TMessage); begin case AMsg.Msg of WM_SETTINGCHANGE: begin // смотрим наличие ImmersiveColorSet в сообщении и включаем нужную тему из нужного StyleBook на форме end; end; AMsg.Result := CallWindowProc(FPrevWndProc, FormToHWND(Self), AMsg.Msg, AMsg.WParam, AMsg.LParam); end; procedure TMyForm.CreateHandle; begin inherited; var LHandle: HWND := FormToHWND(Self); FPrevWndProc := TFNWndProc(GetWindowLong(LHandle, GWL_WNDPROC)); FWndProc := MakeObjectInstance(FormWndProc); SetWindowLong(LHandle, GWL_WNDPROC, NativeInt(FWndProc)); end; {$ENDIF} Изменено 22 сентября, 2025 пользователем Tumaso Vasya 1 Цитата
0 Vasya Опубликовано 22 сентября, 2025 Автор Опубликовано 22 сентября, 2025 (изменено) 29 минут назад, Tumaso сказал: Хендлер делается несложно, создаешь его и вешаешь свой обработчик сообщений Ох ничего себе... как на голом API... Я думал, есть какой продуманный способ. А вот что-то в духе https://docwiki.embarcadero.com/Libraries/Sydney/en/FMX.Platform.IFMXSystemAppearanceService, но чтобы событие было, не существует в FMX? Вообще, странно, что в такой мощнейшей библиотеке через API надо делать такую очевидную потребность. А "включаем нужную тему" - можно поподробнее? Что там за темы? Там же стили только. Изменено 22 сентября, 2025 пользователем Vasya Цитата
0 Tumaso Опубликовано 22 сентября, 2025 Опубликовано 22 сентября, 2025 4 часа назад, Vasya сказал: Там же стили только. стили, темы - это одно и тоже)) Цитата
0 Vasya Опубликовано 17 октября, 2025 Автор Опубликовано 17 октября, 2025 Благодарю - детект заработал идеально! Цитата
Вопрос
Vasya
Приветствую товарищи!
Каким образом на FMX сделать динамическую реакцию на изменение цветовой схемы Windows (светлая/тёмная)? В VCL это делалось через обработку WM_SETTINGCHANGE, но здесь же нет хендлеров...
И как грамотно загружать саму схему?
Кстати, может, кому пригодится - рамку окна можно менять с помощью https://github.com/HemulGM/WindowDarkMode. Но только рамку.
Изменено пользователем Vasya4 ответа на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.