暗色窗口框架在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](https://stackoverflow.com/a/62811758)
。
这就是我如何尝试在 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 是 DWMWINDOWATTRIBUTE::DWMWA_USE_IMMERSIVE_DARK_MODE */
&useDarkTheme, sizeof(useDarkTheme));
}