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

你如何使用DwmGetColorizationColor

该文件说它返回两个值:

  • 包含用于玻璃组成的颜色的32位0xAARRGGBB
  • 一个布尔参数是真的“如果颜色是不透明的混合”( 不pipe是什么意思

这是我喜欢的颜色,一个很好的呕吐绿色: 替代文字

您可以注意到颜色很绿,半透明的标题栏(在白色背景下)非常清晰地显示了鼻涕的颜色: 在这里输入图像描述

我尝试从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%的不透明度:

替代文字

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

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

我尝试使用DwmGetColorizationColor ,但是这不工作得很好。


一个人有同样的问题,但一个更好的shiny的图片来吸引你松鼠: 替代文字

因此,它归结为 – DwmGetColorizationColor是完全不可用的应用程序试图将当前的颜色应用到不透明的表面上。


我喜欢这个人的截图比我的好得多。 以他的截图作为模板,我做出了更多的闪光点:

替代文字

替代文字

替代文字

替代文字

替代文字

替代文字

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

编辑2:必须安排他们在彩虹颜色。 (我就是这样一个怪胎)

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


无证/不支持/易碎变通办法

在入口点137处有一个来自DwmApi.dll的未DwmApi.dll输出,我们将其称为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

我们也可以从registry中读取值:

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

所以你select创buildappcompat问题的毒药。 您可以

  • 依靠一个无证API(这是坏的 , 坏的 , 坏的 , 随时可以离开 )
  • 使用无证的registry键(这也是不好的 , 可以随时离开 )

也可以看看

  • 是否有GetThemeColor / Visual Styles API的有效参数组合列表
  • Windows如何更改Aero Glass颜色?
  • DWM – 使用DWMGetColorizationColor的着色颜色处理
  • 检索不透明表面渲染的Aero Glass基色

我一直想问这个问题一年多了。 我一直知道这是不可能回答的,要让任何人真正关注的唯一方法就是拥有丰富多彩的截图; 开发商被shiny的东西所吸引。 但是,这意味着我不得不把各种各样的工作做成诱饵。

着色颜色!=select的基本颜色。 这是误导,我知道。

但是我很困惑。 您借用的图片来自我的文章,题为“ 获取不透明表面渲染的Aero Glass基础颜色 ”。 这不是你想要做的吗? 我还在post中指出了存储所有颜色信息的registry位置(HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ DWM)用于检索目的。

编辑8/26

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

您需要/想要的所有颜色信息可以在上面提到的registry项中find。 基本颜色,混合中使用的颜色和最终的着色颜色都在那里。

(上面的关键是在Windows Vista及以上版本。)

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

第一步是parsingAARRGGBB。 然后把所得到的RGB转换成HSV。 全亮度下的纯色调加饱和度是基本颜色。 现在,在纯色调和饱和度的顶部将Alpha值覆盖为Alpha的灰度,以获得Aero颜色。 然后在框架颜色上叠加该颜色:rgb(235,235,235)在Intensity中以获得最终的复合Aero颜色结果。

最后,我还提供了一个如何提取与Aero框架颜色相匹配的可用工具栏颜色的示例,但始终与黑色文本和其他基本Aerofunction配合使用。 这是通过限制强度达到35%来完成的。

这是math:

  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); 

A0F040如何看待你?


OP编辑:这是如何0xA0F040在我看来:

替代文字

你有没有尝试DwmGetColorizationParameters,并从中混合/工作?

Interesting Posts