暗色窗口框架在Windows 10

不时地,我遇到了一个问题,即应用程序有暗色主题,但窗口框架是浅色的。因此,我在这里保存了两种在Windows 10上更改它的方法。

对于应用程序用户#

我立刻告诉你:如果强调颜色对你很重要,这种方式将不会有用。

打开注册表编辑器,找到 HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\DWM 部分。你需要从它那里获取以下参数:

  • ColorPrevalence: DWORD = 1 这个参数允许使用强调颜色作为标题栏颜色。
  • AccentColorAccentColorInactive: 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));
  }