文档说它返回两个值:
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 问题的毒药。你可以
也可以看看
- 是否有 GetThemeColor / Visual Styles API 的有效参数组合列表
- Windows 如何改变 Aero Glass 的颜色?
- DWM - 使用 DWMGetColorizationColor 进行着色颜色处理
- 检索 Aero Glass 基色以进行不透明表面渲染
一年多来,我一直想问这个问题。我一直都知道这是不可能回答的,而让任何人真正关注的唯一方法就是拥有彩色截图;开发人员被闪亮的东西所吸引。但不利的一面是,这意味着我必须投入各种工作来制作诱饵。