internal static void SetBlur(IntPtr hwnd, AccentFlagsType style = AccentFlagsType.Window, AccentState?state = null) { var accent = new AccentPolicy(); var accentStructSize = Marshal.SizeOf(accent); accent.AccentState = state ?? SelectAccentState(); if (style == AccentFlagsType.Window) { accent.AccentFlags = 2; } else { accent.AccentFlags = 0x20 | 0x40 | 0x80 | 0x100; } //accent.GradientColor = 0x99FFFFFF; // 60%の透明度が基本 accent.GradientColor = 0x00FFFFFF; // Tint Colorはここでは設定せず、Bindingで外部から変えられるようにXAML側のレイヤーとして定義 var accentPtr = Marshal.AllocHGlobal(accentStructSize); Marshal.StructureToPtr(accent, accentPtr, false); var data = new WindowCompositionAttributeData(); data.Attribute = WindowCompositionAttribute.WCA_ACCENT_POLICY; data.SizeOfData = accentStructSize; data.Data = accentPtr; SetWindowCompositionAttribute(hwnd, ref data); Marshal.FreeHGlobal(accentPtr); }
internal static void SetBlur(Window win, AcrylicAccentState state, AccentFlagsType style = AccentFlagsType.Window) { var windowHelper = new WindowInteropHelper(win); var value = AcrylicHelper.SelectAccentState(state); AcrylicHelper.SetBlur(windowHelper.Handle, style, value); }
internal static void EnableBlur(IntPtr hwnd, AccentFlagsType style = AccentFlagsType.Window) { var accent = new AccentPolicy(); var accentStructSize = Marshal.SizeOf(accent); // ウィンドウ背景のぼかしを行うのはWindows10の場合のみ // OSのバージョンに従い、AccentStateを切り替える var currentVersion = SystemInfo.Version.Value; if (currentVersion >= VersionInfos.Windows10_1903) { // Windows10 1903以降では、ACCENT_ENABLE_ACRYLICBLURBEHINDを用いると、ウィンドウのドラッグ移動などでマウス操作に追従しなくなる。 // SetWindowCompositionAttribute関数の動作が修正されるまで、ACCENT_ENABLE_ACRYLICBLURBEHINDは使用しない。 accent.AccentState = AccentState.ACCENT_ENABLE_BLURBEHIND; } else if (currentVersion >= VersionInfos.Windows10_1809) { accent.AccentState = AccentState.ACCENT_ENABLE_ACRYLICBLURBEHIND; } else if (currentVersion >= VersionInfos.Windows10) { accent.AccentState = AccentState.ACCENT_ENABLE_BLURBEHIND; } else { accent.AccentState = AccentState.ACCENT_ENABLE_TRANSPARENTGRADIENT; } if (style == AccentFlagsType.Window) { accent.AccentFlags = 2; } else { accent.AccentFlags = 0x20 | 0x40 | 0x80 | 0x100; } //accent.GradientColor = 0x99FFFFFF; // 60%の透明度が基本 accent.GradientColor = 0x00FFFFFF; // Tint Colorはここでは設定せず、Bindingで外部から変えられるようにXAML側のレイヤーとして定義 var accentPtr = Marshal.AllocHGlobal(accentStructSize); Marshal.StructureToPtr(accent, accentPtr, false); var data = new WindowCompositionAttributeData(); data.Attribute = WindowCompositionAttribute.WCA_ACCENT_POLICY; data.SizeOfData = accentStructSize; data.Data = accentPtr; SetWindowCompositionAttribute(hwnd, ref data); Marshal.FreeHGlobal(accentPtr); }
/// <summary> /// Enable blur effect in windows platform /// </summary> /// <param name="hwnd"></param> /// <param name="style"></param> /// <param name="state"></param> /// <param name="accentColor"></param> internal static void EnableBlur(IntPtr hwnd, uint accentColor = AccentColor, AccentFlagsType style = AccentFlagsType.Window, AccentState state = AccentState.ACCENT_DISABLED) { var accent = new AccentPolicy(); var accentStructSize = Marshal.SizeOf(accent); accent.AccentState = state == AccentState.ACCENT_DISABLED ? CheckPlatformSupport(state) : state; accent.AccentFlags = style == AccentFlagsType.Window ? 2 : 0x20 | 0x40 | 0x80 | 0x100; accent.GradientColor = accentColor; var accentPtr = Marshal.AllocHGlobal(accentStructSize); Marshal.StructureToPtr(accent, accentPtr, false); var data = new WindowCompositionAttributeData { Attribute = WindowCompositionAttribute.WCA_ACCENT_POLICY, SizeOfData = accentStructSize, Data = accentPtr }; _ = SetWindowCompositionAttribute(hwnd, ref data); Marshal.FreeHGlobal(accentPtr); }