Vista / 7:如何获得玻璃颜色?

时间:2010-08-24 20:47:42

标签: winapi aero user-preferences dwm

您如何使用DwmGetColorizationColor

documentation表示它返回两个值:

  • 包含用于玻璃成分的颜色的32位0xAARRGGBB
  • 一个布尔参数,如果颜色是不透明的混合,则为真“(无论意味着什么

这是我喜欢的一种颜色,一个很好的呕吐绿色: alt text

您可以注意到颜色为绿色,半透明标题栏(白色背景)非常清晰地显示了鼻涕颜色: enter image description here

我尝试从Windows获取颜色:

DwmGetColorizationColor(dwCcolorization, bIsOpaqueBlend);

我得到了

dwColorization: 0x0D0A0F04
bIsOpaqueBlend: false

根据文档,此值的格式为AARRGGBB,因此包含:

AA: 0x0D (13)
RR: 0x0A (10)
GG: 0x0F (15)
BB: 0x04 (4)

这可能意味着颜色为(10,15,4),不透明度为~5.1%。

但是,如果你真的看到这个RGB值,那么它远远不能满足我想要的鼻涕绿色。这是

  • (10,15,4),不透明度(原始颜色)和
  • (10,15,4)对白色/棋盘背景的不透明度为5%:

alt text

Lime不是DwmGetColorizationColor绿色,而是返回几乎完全透明的黑色

所以问题是:如何在Windows Vista / 7中获得玻璃颜色

我尝试使用DwmGetColorizationColor,但效果不佳。


A person with same problem, but a nicer shiny picture吸引你松鼠: alt text

  

所以,归结为 -   DwmGetColorizationColor是完全的   无法用于尝试的应用程序   将当前颜色应用到   不透明的表面。


我爱this guy's screenshots比我好得多。使用他的截图作为模板,我制作了更多的火花:

alt text

alt text

alt text

alt text

alt text

alt text

对于最后两个截图,alpha混合芯片是一个真正的部分透明PNG,融合到浏览器的背景中。凉! (我是个极客)

编辑2:必须以彩虹色排列它们。 (我是个极客)

编辑3:现在我当然要添加黄色。


未记录/不支持/易碎的解决方法

来自DwmApi.dll的入口点137有一个未记录的导出,我们称之为DwmGetColorizationParameters

HRESULT GetColorizationParameters_Undocumented(out DWMCOLORIZATIONPARAMS params);

struct DWMCOLORIZATIONPARAMS
{
   public UInt32 ColorizationColor;
   public UInt32 ColorizationAfterglow;
   public UInt32 ColorizationColorBalance;
   public UInt32 ColorizationAfterglowBalance;
   public UInt32 ColorizationBlurBalance;
   public UInt32 ColorizationGlassReflectionIntensity;
   public UInt32 ColorizationOpaqueBlend;
}

我们对第一个参数ColorizationColor感兴趣。

我们还可以从注册表中读取值:

HKEY_CURRENT_USER\Software\Microsoft\Windows\DWM
    ColorizationColor: REG_DWORD = 0x6614A600

所以你选择了创建appcompat问题的毒药。你可以

另见


我一直想问这个问题一年多了。我一直都知道这是不可能回答的,让人们真正关注的唯一方法就是拥有丰富多彩的截图;开发人员被闪亮的东西所吸引。但在不利方面,这意味着我不得不把各种各样的工作放到诱饵上。

3 个答案:

答案 0 :(得分:10)

着色颜色!=所选的基色。我知道这是误导。

但我很困惑。您借来的图片来自我的帖子“Retrieving Aero Glass base color for opaque surface rendering”。这不是你想做的吗?我还在帖子中指出了存储所有颜色信息的注册表位置(HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ DWM)以供检索。

已编辑8/26

DwmGetColorizationColor(dwmapi.dll)返回“着色颜色”,它是各种颜色(包括您选择的基色)和着色器逻辑的混合,以实现整体玻璃效果。

您需要/想要的所有颜色信息都可以在上面提到的注册表项中找到。基色,混合中使用的颜色以及产生的着色颜色都在那里。

(上面的密钥出现在Windows Vista及更高版本上。)

答案 1 :(得分:2)

我相信我已经解决了Aero Color。 ColorizationColor给出的颜色实际上是AARRGGBB,但它并没有按你想象的方式使用。并且为了解决最终颜色,您还需要获得颜色强度,如下所示:http://www.codeproject.com/Articles/610909/Changing-Windows-Aero-Color

第一步是解析AARRGGBB。然后获取生成的RGB并转换为HSV。完全亮度的纯色调加饱和度是基色。现在将Alpha叠加为纯色调和饱和度顶部的Alpha灰度,以获得Aero颜色。然后将该颜色覆盖在帧颜色上:rgb(235,235,235)在Intensity处获得最终的Composite Aero颜色结果。

最后,我还提供了一个示例,说明如何提取与Aero框架颜色相匹配的可用工具栏颜色,但始终使用黑色文本和其他基本Aero功能。这是通过将强度限制在35%来实现的。

这是数学:

  function dwmToRgb() { 
    // Input Values
    var colorizationColor = "a84f1b1b"; // dwmcolor.clrColor = ColorizationColor
    var colorizationColorBalance = 60; // dwmcolor.nIntensity = ColorizationColorBalance 
    var F = 235; // Frame base grayscale color when Transparency is disabled

    // Parse the input values    
    var A = Math.round(parseInt(colorizationColor.substr(0,2),16)/2.55)/100;
    var R1 = parseInt(colorizationColor.substr(2,2), 16);
    var G1 = parseInt(colorizationColor.substr(4,2), 16);
    var B1 = parseInt(colorizationColor.substr(6,2), 16);
    var I = colorizationColorBalance/100;

    // Solve for HSV Value and pure Hue+Sat
    var V = Math.max(R1, G1, B1);
    var R2 = R1*255/V;
    var G2 = G1*255/V;
    var B2 = B1*255/V;

    // Aero Frame Pure Hue: Overlay Value @ Alpha over pure Hue+Sat
    var R3 = Math.round(V+(R2-V)-((R2-V)*A));
    var G3 = Math.round(V+(G2-V)-((G2-V)*A));
    var B3 = Math.round(V+(B2-V)-((B2-V)*A)); 
    var hexRGB3 = "#" + ((1 << 24) + (R3 << 16) + (G3 << 8) + B3).toString(16).slice(1);

    // Aero Frame Composite Color: Overlay RGB3 @ Intensity over Frame base color        
    var R4 = Math.round(R3+(F-R3)-((F-R3)*I));
    var G4 = Math.round(G3+(F-G3)-((F-G3)*I));
    var B4 = Math.round(B3+(F-B3)-((F-B3)*I));   
    var hexRGB4 = "#" + ((1 << 24) + (R4 << 16) + (G4 << 8) + B4).toString(16).slice(1);

    // Aero Toolbar Color: Overlay RGB3 @ max 35% Intensity over Frame base color   
    if (I > 0.35) { I5 = 0.35;} else { I5 = I;}
    var R5 = Math.round(R3+(F-R3)-((F-R3)*I5));
    var G5 = Math.round(G3+(F-G3)-((F-G3)*I5));
    var B5 = Math.round(B3+(F-B3)-((F-B3)*I5));   
    var hexRGB5 = "#" + ((1 << 24) + (R5 << 16) + (G5 << 8) + B5).toString(16).slice(1);

答案 2 :(得分:1)

A0F040如何看待你?


OP编辑:这就是0xA0F040对我的看法:

alt text