如何在Windows 8.1中获得WPF窗口的标题栏颜色
本文关键字:WPF 窗口 颜色 标题栏 Windows | 更新日期: 2023-09-27 18:11:30
要使用WindowChrome类自定义窗口的外观,我想在Windows 8.1中获得WPF窗口的标题栏颜色。
首先,我试了
SystemParameters.WindowGlassColor
但是这个属性不包含正确的alpha值(总是255)。
第二,我试了这个函数:
DwmGetColorizationColor
一开始似乎很好。返回值具有正确的颜色信息,包括alpha通道。但是,在"颜色与外观"对话框中通过滑动条更改"颜色强度"时,返回值会偏离实际值,并且显示出奇怪的颜色。
那么,有没有人有替代方法或解决方法的想法?
我找到了一个解决方案。其实,基本点已经讨论过了。
- 获取Windows 8自动颜色主题的活动颜色
- 更改Windows Aero颜色
顺序为:
- 通过DwmGetColorizationParameters函数获取参数(未公开API)
- 将colorizationColor参数转换为Color,忽略alpha通道
- 准备底色(R=217, G=217, B=217)
- 使用colorizationColorBalance参数混合两种颜色,该参数对应于"颜色强度"。
public static Color? GetChromeColor()
{
bool isEnabled;
var hr1 = DwmIsCompositionEnabled(out isEnabled);
if ((hr1 != 0) || !isEnabled) // 0 means S_OK.
return null;
DWMCOLORIZATIONPARAMS parameters;
try
{
// This API is undocumented and so may become unusable in future versions of OSes.
var hr2 = DwmGetColorizationParameters(out parameters);
if (hr2 != 0) // 0 means S_OK.
return null;
}
catch
{
return null;
}
// Convert colorization color parameter to Color ignoring alpha channel.
var targetColor = Color.FromRgb(
(byte)(parameters.colorizationColor >> 16),
(byte)(parameters.colorizationColor >> 8),
(byte)parameters.colorizationColor);
// Prepare base gray color.
var baseColor = Color.FromRgb(217, 217, 217);
// Blend the two colors using colorization color balance parameter.
return BlendColor(targetColor, baseColor, (double)(100 - parameters.colorizationColorBalance));
}
private static Color BlendColor(Color color1, Color color2, double color2Perc)
{
if ((color2Perc < 0) || (100 < color2Perc))
throw new ArgumentOutOfRangeException("color2Perc");
return Color.FromRgb(
BlendColorChannel(color1.R, color2.R, color2Perc),
BlendColorChannel(color1.G, color2.G, color2Perc),
BlendColorChannel(color1.B, color2.B, color2Perc));
}
private static byte BlendColorChannel(double channel1, double channel2, double channel2Perc)
{
var buff = channel1 + (channel2 - channel1) * channel2Perc / 100D;
return Math.Min((byte)Math.Round(buff), (byte)255);
}
[DllImport("Dwmapi.dll")]
private static extern int DwmIsCompositionEnabled([MarshalAs(UnmanagedType.Bool)] out bool pfEnabled);
[DllImport("Dwmapi.dll", EntryPoint = "#127")] // Undocumented API
private static extern int DwmGetColorizationParameters(out DWMCOLORIZATIONPARAMS parameters);
[StructLayout(LayoutKind.Sequential)]
private struct DWMCOLORIZATIONPARAMS
{
public uint colorizationColor;
public uint colorizationAfterglow;
public uint colorizationColorBalance; // Ranging from 0 to 100
public uint colorizationAfterglowBalance;
public uint colorizationBlurBalance;
public uint colorizationGlassReflectionIntensity;
public uint colorizationOpaqueBlend;
}