78 lines
2.2 KiB
C#
78 lines
2.2 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Runtime.InteropServices;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Windows;
|
|
using System.Windows.Interop;
|
|
|
|
namespace GeekDesk.Util
|
|
{
|
|
public class BlurGlassUtil
|
|
{
|
|
internal enum AccentState
|
|
{
|
|
ACCENT_DISABLED = 1,
|
|
ACCENT_ENABLE_GRADIENT = 0,
|
|
ACCENT_ENABLE_TRANSPARENTGRADIENT = 2,
|
|
ACCENT_ENABLE_BLURBEHIND = 3,
|
|
ACCENT_INVALID_STATE = 4
|
|
}
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
internal struct AccentPolicy
|
|
{
|
|
public AccentState AccentState;
|
|
public int AccentFlags;
|
|
public int GradientColor;
|
|
public int AnimationId;
|
|
}
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
internal struct WindowCompositionAttributeData
|
|
{
|
|
public WindowCompositionAttribute Attribute;
|
|
public IntPtr Data;
|
|
public int SizeOfData;
|
|
}
|
|
|
|
internal enum WindowCompositionAttribute
|
|
{
|
|
// ...
|
|
WCA_ACCENT_POLICY = 19
|
|
// ...
|
|
}
|
|
|
|
[DllImport("user32.dll")]
|
|
internal static extern int SetWindowCompositionAttribute(IntPtr hwnd, ref WindowCompositionAttributeData data);
|
|
|
|
|
|
public static void EnableBlur(Window window)
|
|
{
|
|
WindowInteropHelper windowHelper = new WindowInteropHelper(window);
|
|
|
|
AccentPolicy accent = new AccentPolicy
|
|
{
|
|
AccentState = AccentState.ACCENT_ENABLE_BLURBEHIND
|
|
};
|
|
|
|
int accentStructSize = Marshal.SizeOf(accent);
|
|
|
|
IntPtr accentPtr = Marshal.AllocHGlobal(accentStructSize);
|
|
Marshal.StructureToPtr(accent, accentPtr, false);
|
|
|
|
WindowCompositionAttributeData data = new WindowCompositionAttributeData
|
|
{
|
|
Attribute = WindowCompositionAttribute.WCA_ACCENT_POLICY,
|
|
SizeOfData = accentStructSize,
|
|
Data = accentPtr
|
|
};
|
|
|
|
SetWindowCompositionAttribute(windowHelper.Handle, ref data);
|
|
|
|
Marshal.FreeHGlobal(accentPtr);
|
|
}
|
|
}
|
|
}
|