簡體   English   中英

如何在Windows 8中獲取窗口標題欄(活動和非活動)顏色?

[英]How to get window title bar (active and inactive) color in Windows 8?

我正在編寫一個程序,我需要繪制一個與標題欄顏色相同的矩形。

如果我嘗試獲得這樣的顏色:

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代碼似乎可以正常工作,除非我在“控制面板”中將顏色強度設置為max(因為不知何故alpha為0,顏色為綠色)或min。

EDIT2:這不是重復的,因為這是專門針對W8 +的。

這是一個棘手的解決方案,可能僅適用於Windows 8和8.1(我將在稍后的10中進行測試)。

我分析了窗戶的顏色,這是我可以看到的:

  • 活動窗口的標題(或標題)顏色之間混合的結果0xD9D9D9和顏色\\HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\DWM\\ColorizationColor使用的值\\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上不起作用,所以不同系統的用戶應該使用不同的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM