Тёмная рамка окна на Windows 10
Периодически я натыкаюсь на проблему, что у приложения тёмная тема, но светлая рамка окна. Поэтому тут я сохраню пару способов, как её поменять на Windows 10.
Для тех, кто пользуется приложениями
Сразу скажу: этот способ вам не подойдёт, если вам важен акцентный цвет.
Откройте редактор реестра и найдите раздел HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\DWM
. В нём вам нужны следующие параметры:
ColorPrevalence
: DWORD = 1
Этот параметр позволяет использовать акцентный цвет в заголовке окна.AccentColor
иAccentColorInactive
: DWORD = цвет в формате ABGR (в шестнадцатеричном виде).
Цвета в активном и неактивном виде.
Пример файла для реестра, где используются цвета #000000
для активного заголовка и #212121
для неактивного:
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\DWM]
"ColorPrevalence"=dword:00000001
"AccentColor"=dword:ff000000
"AccentColorInactive"=dword:ff212121
Для тех, кто пишет приложения
Вам потребуется функция DwmSetWindowAttribute :
HRESULT DwmSetWindowAttribute(
HWND hwnd, // окно
DWORD dwAttribute, // сам атрибут
[in] LPCVOID pvAttribute, // значение
DWORD cbAttribute // размер значения в байтах
);
Значения атрибутов описаны в DWMWINDOWATTRIBUTE
, но конкретно нас интересует DWMWA_USE_IMMERSIVE_DARK_MODE
. В документации указано, что он равен 20
, однако до версии 20H1 значение было равно 19
.
Примерно так я пытался делать автоопределение темы рамки в Ultimate++ :
HRESULT (WINAPI *DwmSetWindowAttribute)(HWND hwnd, DWORD dwAttribute, LPCVOID pvAttribute, DWORD cbAttribute);
DllFn(DwmSetWindowAttribute, "dwmapi.dll", "DwmSetWindowAttribute");
if (DwmSetWindowAttribute) {
BOOL useDarkTheme = IsDarkTheme();
DwmSetWindowAttribute(
top->hwnd, 20, /* 20 is DWMWINDOWATTRIBUTE::DWMWA_USE_IMMERSIVE_DARK_MODE */
&useDarkTheme, sizeof(useDarkTheme));
}