How to get title bar color of WPF window in Windows 8.1?

后端 未结 1 657
醉酒成梦
醉酒成梦 2021-01-14 17:22

To customize window\'s appearance using WindowChrome class, I would like to get the title bar color of WPF window in Windows 8.1.

First, I tried

Sys         


        
相关标签:
1条回答
  • 2021-01-14 18:07

    I found a solution. Actually, the basic point has been already discussed.

    • Get the active color of Windows 8 automatic color theme
    • Changing Windows Aero Color

    The sequence will be:

    1. Get parameters by DwmGetColorizationParameters function (undocumented API).
    2. Convert colorizationColor parameter to Color ignoring alpha channel.
    3. Prepare base gray color (R=217, G=217, B=217).
    4. Blend the two colors using colorizationColorBalance parameter which corresponds to "Color Intensity".

    So, my code is as follows:

    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;
    }
    
    0 讨论(0)
提交回复
热议问题