从October 2018 Update (version 1809)
开始,Win10在Windows资源管理器中支持Dark主题。
它可以在这里配置:
Desktop | Context Menu | Personalize | Colors | Choose your default app mode = Dark
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize\AppsUseLightTheme
= DWORD:0
虽然此设置现在存在一段时间,但它仅影响UWP应用程序。但是,使用此Windows 10版本,它还会影响Windows资源管理器,这是一个桌面应用程序。这意味着Windows现在具有内部支持。此外,Windows资源管理器以外的桌面应用程序目前不受影响。
我想在我的应用程序中使用它。它是如何在引擎盖下实施的?是否有某种方式(清单,WINAPI等)订阅新的黑暗主题?
更新1: 我注意到Windows资源管理器控制面板部分较亮且部分较暗,因此应该是按窗口设置,而不是按进程设置。
另一个例子:打开文件对话框在所有桌面应用程序中变暗,而应用程序本身仍然保持旧光主题。
更新2:
我为SetWindowTheme(hwnd, L"Explorer", NULL);
和TreeView
尝试了ListView
。这明显改变了TreeView
风格(+
展开按钮变成V
),但窗口仍然是白色的。
经过一番挖掘,我找到了这两种方法。两者都没有记录,可能会更改,恕不另行通知。
1
SetWindowTheme(hwnd, L"DarkMode_Explorer", NULL);
2
using TYPE_AllowDarkModeForWindow = bool (WINAPI *)(HWND a_HWND, bool a_Allow);
static const TYPE_AllowDarkModeForWindow AllowDarkModeForWindow = (TYPE_AllowDarkModeForWindow)GetProcAddress(hUxtheme, MAKEINTRESOURCEA(133));
AllowDarkModeForWindow(a_HWND, true);
SetWindowTheme(hwnd, L"Explorer", NULL);
警告:Ordinal 133在其他版本的Windows上可能具有完全不同的API,包括更新/更旧的Win10版本。
两种方法都适用一些效果,但不是一切。
例如,TreeView
为所选项目获取黑色滚动条和深色背景,但其余背景保持默认。
不幸的是,到目前为止它并不像“调用一个函数那样”。似乎即使应用了正确的主题,也需要手动处理一些背景颜色。
我不确定您是否要将主题应用于您的应用程序,或者只是在您的应用程序中启用黑暗主题。
对于第一个,您可以使用SetWindowTheme(hwndList, L"Explorer", NULL);
它可以给出Windows资源管理器列表的外观。
对于第二个,这是注册表中的关键值:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize\AppsUseLightTheme
to控制主题。值= 1,表示光;值= 0,表示暗;使用注册表api设置值:
#include<iostream>
#include <windows.h>
int main()
{
HKEY hKey;
long setRes;
DWORD dwValue = 1;
setRes = RegOpenKeyExA(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize", 0, KEY_SET_VALUE, &hKey);
if (setRes != ERROR_SUCCESS)
{
printf("Failed, error %d\n", setRes);
return -1;
}
setRes = RegSetValueExA(hKey, "AppsUseLightTheme", NULL, REG_DWORD, (LPBYTE)&dwValue, sizeof(DWORD));
if (setRes != ERROR_SUCCESS)
{
printf("Failed, error %d\n", setRes);
return -1;
}
RegCloseKey(hKey);
return 0;
}