Windows

Тёмная рамка окна на 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));
	}