using System.Runtime.InteropServices; using HandyControl.Data; using HandyControl.Tools; using HandyControl.Tools.Interop; namespace HandyControl.Controls { public class BlurWindow : Window { public override void OnApplyTemplate() { base.OnApplyTemplate(); EnableBlur(this); } private static SystemVersionInfo GetSystemVersionInfo() { var osv = new InteropValues.RTL_OSVERSIONINFOEX(); osv.dwOSVersionInfoSize = (uint) Marshal.SizeOf(osv); InteropMethods.Gdip.RtlGetVersion(out osv); return new SystemVersionInfo((int) osv.dwMajorVersion, (int) osv.dwMinorVersion, (int) osv.dwBuildNumber); } internal static void EnableBlur(Window window) { var versionInfo = GetSystemVersionInfo(); var accentPolicy = new InteropValues.ACCENTPOLICY(); var accentPolicySize = Marshal.SizeOf(accentPolicy); accentPolicy.AccentFlags = 2; if (versionInfo >= SystemVersionInfo.Windows10_1903) { accentPolicy.AccentState = InteropValues.ACCENTSTATE.ACCENT_ENABLE_BLURBEHIND; } else if (versionInfo >= SystemVersionInfo.Windows10_1809) { accentPolicy.AccentState = InteropValues.ACCENTSTATE.ACCENT_ENABLE_ACRYLICBLURBEHIND; } else if (versionInfo >= SystemVersionInfo.Windows10) { accentPolicy.AccentState = InteropValues.ACCENTSTATE.ACCENT_ENABLE_BLURBEHIND; } else { accentPolicy.AccentState = InteropValues.ACCENTSTATE.ACCENT_ENABLE_TRANSPARENTGRADIENT; } accentPolicy.GradientColor = ResourceHelper.GetResource(ResourceToken.BlurGradientValue); var accentPtr = Marshal.AllocHGlobal(accentPolicySize); Marshal.StructureToPtr(accentPolicy, accentPtr, false); var data = new InteropValues.WINCOMPATTRDATA { Attribute = InteropValues.WINDOWCOMPOSITIONATTRIB.WCA_ACCENT_POLICY, DataSize = accentPolicySize, Data = accentPtr }; InteropMethods.Gdip.SetWindowCompositionAttribute(window.GetHandle(), ref data); Marshal.FreeHGlobal(accentPtr); } } }