Win10黑暗主题 - 如何在WINAPI中使用?

问题描述 投票:4回答:2

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),但窗口仍然是白色的。

windows winapi themes
2个回答
4
投票

经过一番挖掘,我找到了这两种方法。两者都没有记录,可能会更改,恕不另行通知。

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为所选项目获取黑色滚动条和深色背景,但其余背景保持默认。

不幸的是,到目前为止它并不像“调用一个函数那样”。似乎即使应用了正确的主题,也需要手动处理一些背景颜色。


-2
投票

我不确定您是否要将主题应用于您的应用程序,或者只是在您的应用程序中启用黑暗主题。

对于第一个,您可以使用SetWindowTheme(hwndList, L"Explorer", NULL);它可以给出Windows资源管理器列表的外观。

对于第二个,这是注册表中的关键值:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize\AppsUseLightThemeto控制主题。值= 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;
}
© www.soinside.com 2019 - 2024. All rights reserved.