你怎么用DwmGetColorizationColor?
The 文档说它返回两个值:
- 32 位
0xAARRGGBB
含有用于玻璃成分的颜色
- 一个布尔参数,“如果颜色是不透明的混合颜色”,则为 true (不管什么意思)
Here's a color that i like, a nice puke green:
You can notice the color is greeny, and the translucent title bar (against a white background) shows the snot color very clearly:
我尝试从 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
green, DwmGetColorizationColor
返回几乎完全透明的black.
所以问题是:玻璃颜色如何获得在 Windows Vista/7 中?
我尝试使用DwmGetColorizationColor
,但这效果不太好。
A person with same problem, but a nicer shiny picture to attract you squirrels:
所以,归结为——
DwmGetColorizationColor 完全
无法用于尝试使用的应用程序
将当前颜色应用到
不透明表面。
i love 这个人的截图比我的好多了。使用他的屏幕截图作为模板,我制作了更多的火花:
对于最后两个屏幕截图,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
所以你选择了创建应用程序兼容性问题的毒药。你可以
- 依赖于未记录的 API(即bad, bad, bad, 并且可以随时离开)
- 使用未记录的注册表项(这也是bad, and 随时可以离开)
See also
- 是否有 GetThemeColor / Visual Styles API 的有效参数组合列表
- Windows 如何改变 Aero Glass 颜色?
- DWM - 使用 DWMGetColorizationColor 进行着色颜色处理
- 检索 Aero Glass 基色以进行不透明表面渲染
我一年多以来一直想问这个问题。我一直都知道这是不可能回答的,而让人们真正关注的唯一方法就是拥有丰富多彩的屏幕截图;开发人员被闪亮的东西所吸引。但不利的一面是,这意味着我必须投入各种精力来制作鱼饵。