如何在Windows 8中获取窗口标题栏(活动和非活动)的颜色?

3
我是一名有用的助手,可以为您翻译文本。

我正在制作一个程序,需要绘制与标题栏相同颜色的矩形。

如果我尝试像这样获取颜色:

ARGB rgbActiveColor = GetSysColor(COLOR_ACTIVECAPTION);
ARGB rgbInactiveColor = GetSysColor(COLOR_INACTIVECAPTION);
rgbActiveColor |= 0xFF000000;    // Because of alpha
rgbInactiveColor |= 0xFF000000;

我在Windows 8中看到的颜色与实际颜色完全不同。它总是返回橙色或棕色,而不是实际颜色(比如蓝色)。

使用DwmGetColorizationColor可以解决问题,但是由于需要消除alpha通道,所以颜色会变暗。我尝试这样做:

BYTE r = ((RED * ALPHA) + (255 * (255 - ALPHA))) / 255; // R' = (R * A) + (1 - A)
BYTE g = ((GREEN * ALPHA) + (255 * (255 - ALPHA))) / 255; // G' = (G * A) + (1 - A)
BYTE b = ((BLUE * ALPHA) + (255 * (255 - ALPHA))) / 255; // B' = (B * A) + (1 - A)

所以,我的问题是:

  1. 我不知道如何正确地将ARGB颜色转换为RGB颜色
  2. 我不知道如何获取非活动标题栏的颜色

编辑:我的ARGB转RGB代码似乎有效,除非我在控制面板中将颜色强度设置到最大(因为某种原因alpha为0,颜色变成绿色)或最小。

编辑2:这不是重复问题,因为这主要是关于W8+的。


你尝试过这样写吗:COLORREF rgb = RGB((BYTE)rgbActiveColor >> 16, (BYTE)rgbActiveColor >> 8, (BYTE)rgbActiveColor); - Cyclonecode
1
GetSysColor() 只返回 RGB 而不是 RGBA,对吗? - Cyclonecode
@Cyclone 对于蓝色,正常亮度是0xe37ebdf4,但最大亮度为0x008fd712。文档还指出:“该值的颜色格式为0xAARRGGBB”。 - LHLaurini
这可能有所帮助 https://dev59.com/xWjWa4cB1Zd3GeqPtLSM - Cyclonecode
@Cyclone,我不知道我还能做什么。DwmGetColorizationColor不能正常工作,GetThemeSysColor返回与GetSysColor相同的值,GetThemeColor(hTheme, WP_CAPTION, CS_ACTIVE, TMT_ACTIVECAPTION, &rgbBorderColor)返回错误... - LHLaurini
显示剩余5条评论
1个回答

0

这是一个hackish解决方案,可能只适用于Windows 8和8.1(我将在稍后测试Windows 10)。

我分析了Windows颜色,发现以下内容:

  • 活动窗口标题(或标题)的颜色是使用\HKEY_CURRENT_USER\Software\Microsoft\Windows\DWM\ColorizationColor中的颜色与0xD9D9D9进行混合,并使用\HKEY_CURRENT_USER\Software\Microsoft\Windows\DWM\ColorizationColorBalance中的值(它在0-100范围内)作为“alpha”。
  • 非活动窗口的颜色为0xEBEBEB。

所以...

if (fActive)
{
    DWORD ColorizationColor;
    DWORD ColorizationColorBalance;
    DWORD size = sizeof(DWORD);

    RegGetValue(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\DWM", L"ColorizationColor", RRF_RT_REG_DWORD, 0, &ColorizationColor, &size);
    RegGetValue(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\DWM", L"ColorizationColorBalance", RRF_RT_REG_DWORD, 0, &ColorizationColorBalance, &size);

    BYTE ALPHA = 255 * ColorizationColorBalance / 100; // Convert from 0-100 to 0-255
    BYTE RED = (ColorizationColor >> 16) & 0xFF;
    BYTE GREEN = (ColorizationColor >> 8) & 0xFF;
    BYTE BLUE = ColorizationColor & 0xFF;

    BYTE r = ((RED * ALPHA) + (0xD9 * (255 - ALPHA))) / 255;
    BYTE g = ((GREEN * ALPHA) + (0xD9 * (255 - ALPHA))) / 255;
    BYTE b = ((BLUE * ALPHA) + (0xD9 * (255 - ALPHA))) / 255;

    graphics.FillRectangle(&SolidBrush(Color(r, g, b)), Rect(...);
}
else
{
    graphics.FillRectangle(&SolidBrush(0xFFEBEBEB), Rect(...));
}

由于这可能在Windows 7上无法正常工作,因此应为不同的系统使用不同的代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接