我正在寻找如何获取系统主题颜色。我找到了 GetSysColor 和 GetSysColorBrush。然后我用类似的东西测试了它:
cout << GetSysColorBrush(COLOR_HIGHLIGHT) << endl; //checking the value if it's changing when
//changing system color
WNDCLASSW wc = {0};
wc.hbrBackground = GetSysColorBrush(COLOR_HIGHLIGHT);
wc.hCursor = LoadCursorA(NULL, IDC_ARROW);
wc.hInstance = hInst;
wc.lpfnWndProc = WindowProc;
wc.lpszClassName = L"WindowClass";
if(!RegisterClassW(&wc)) return -1;
CreateWindowW(L"WindowClass", L"Window Name", WS_VISIBLE | WS_POPUP, 0, 0, windowWidth - 500,
windowHeight - 500, NULL, NULL, NULL, NULL);
我认为它有效,因为我有默认的蓝色主题,窗口是蓝色的(完全相同的颜色),然后我将主题更改为绿色,但窗口仍然是蓝色的(显然重新启动程序后)。
现在我的问题:是否可以获取当前的系统主题颜色?
Windows 10 主题颜色可通过 UISettings 类型使用。它也适用于经典桌面应用程序。
以下代码使用 C++/WinRT 检索当前选定的强调色:
#include <winrt/Windows.UI.ViewManagement.h>
#include <iostream>
using namespace winrt;
using namespace Windows::UI::ViewManagement;
int main()
{
UISettings const ui_settings {};
auto const accent_color { ui_settings.GetColorValue(UIColorType::Accent) };
std::wcout << L"R: " << accent_color.R
<< L" G: " << accent_color.G
<< L" B: " << accent_color.B << std::endl;
}
如果您不想或不能使用任何库,您可以仅使用 Win32 API 来完成。没有记录的方法可以使用 Win32 API 执行此操作(只有 WinRT,如其他答案中所示),但您可以从注册表中提取它,这比使用未记录的函数(也存在)安全得多,后者可能会以意想不到的方式崩溃。使用注册表时,您始终可以处理错误并回退到您想要的值。
您可以使用 RegOpenKeyExW、RegQueryValueExW 和 RegCloseKey 从注册表读取值,并使用
GetRValue、
DWORD
和 GetGValue
宏从 GetBValue
解码颜色分量。
用户在设置中选择的强调颜色可以从按键读取
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes\History\Colors\ColorHistory0
操作系统针对不同的地方进行了一些不同的修改,但您可以根据用户的选择获取原始数据。也适用于自动选项。
如果设置了“在标题栏和窗口边框上显示强调色”,则操作系统修改它的一个地方是窗口边框。您也可以通过以下键获得该颜色:
Computer\HKEY_CURRENT_USER\Software\Microsoft\Windows\DWM\AccentColor
要查看彩色窗口边框是否打开,您可以使用此键:
Computer\HKEY_CURRENT_USER\Software\Microsoft\Windows\DWM\ColorPrevalence
注意:请记住,我仅在 Windows 11 上对此进行了测试。我假设所有具有 DWM 的 Windows 版本的密钥都是相同的。在 Windows XP 上,您始终可以使用硬编码的后备值,甚至
GetSysColor(COLOR_HIGHLIGHT)
。