55

你怎么用DwmGetColorizationColor

文档说它返回两个值:

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

这是我喜欢的颜色,漂亮的呕吐绿色: 替代文字

你可以注意到颜色是绿色的,半透明的标题栏(白色背景)非常清楚地显示鼻涕颜色: 在此处输入图像描述

我尝试从 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%:

替代文字

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

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

我尝试使用DwmGetColorizationColor,但效果不是很好。


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

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


我比我更喜欢这家伙的截图。以他的截图为模板,我又制作了一些闪闪发光的东西:

替代文字

替代文字

替代文字

替代文字

替代文字

替代文字

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

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

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


未记录/不受支持/脆弱的解决方法

在入口点 137 处有一个未记录的导出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.

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

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

因此,您选择创建 appcompat 问题的毒药。你可以

也可以看看


一年多来,我一直想问这个问题。我一直都知道这是不可能回答的,而让任何人真正关注的唯一方法就是拥有彩色截图;开发人员被闪亮的东西所吸引。但不利的一面是,这意味着我必须投入各种工作来制作诱饵。

4

3 回答 3

11

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

但我很困惑。您借用的图像来自我的帖子,标题为“检索航空玻璃基色以进行不透明表面渲染”。这不是你想做的吗?我还在帖子中指出了存储所有颜色信息的注册表位置 (HKEY_CURRENT_USER\Software\Microsoft\Windows\DWM) 以供检索。

8/26 编辑

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

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

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

于 2010-08-24T23:16:12.420 回答
2

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

第一步是解析 AARRGGBB。然后获取生成的 RGB 并转换为 HSV。全亮度下的纯色相加饱和度是基色。现在在纯色相和饱和度之上将值叠加为 Alpha 的灰度以获得 Aero 颜色。然后将该颜色覆盖在框架颜色上:rgb(235, 235, 235) 以强度获得最终的 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);
于 2014-04-09T08:09:31.943 回答
1

A0F040 在您看来如何?


OP 编辑​​:这就是 0xA0F040 在我看来的样子:

替代文字

于 2010-08-24T20:52:24.547 回答