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



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

如果我试着得到这样的颜色:

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

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

使用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代码似乎可以工作,除非我在控制面板中将颜色强度设置为最大(因为不知何故阿尔法是0,颜色是绿色)或最小。

编辑2:这不是重复的,因为这是专门关于W8+的。

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

我分析了窗户的颜色,这就是我能看到的:

  • 活动窗口标题(或标题)颜色是使用HKEY_CURRENT_USERSoftwareMicrosoftWindowsDWMColorizationColorBalance中的值(0-100范围内)作为"alpha"在0xD9D9D9HKEY_CURRENT_USERSoftwareMicrosoftWindowsDWMColorizationColor中的颜色之间混合的结果
  • 非活动窗口的颜色为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(...));
}

因为这可能在Windows7上不起作用,不同的代码应该是不同系统的用户。

最新更新