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,并从中混合/工作?