BlurWindow.cs 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. using System;
  2. using System.Runtime.InteropServices;
  3. using HandyControl.Data;
  4. using HandyControl.Tools;
  5. using HandyControl.Tools.Helper;
  6. using HandyControl.Tools.Interop;
  7. namespace HandyControl.Controls;
  8. public class BlurWindow : Window
  9. {
  10. protected override void OnSourceInitialized(EventArgs e)
  11. {
  12. base.OnSourceInitialized(e);
  13. var versionInfo = SystemHelper.GetSystemVersionInfo();
  14. if (versionInfo >= SystemVersionInfo.Windows10_1903)
  15. {
  16. this.GetHwndSource()?.AddHook(HwndSourceHook);
  17. }
  18. }
  19. private IntPtr HwndSourceHook(IntPtr hwnd, int msg, IntPtr wparam, IntPtr lparam, ref bool handled)
  20. {
  21. switch (msg)
  22. {
  23. case InteropValues.WM_ENTERSIZEMOVE:
  24. EnableBlur(this, false);
  25. break;
  26. case InteropValues.WM_EXITSIZEMOVE:
  27. EnableBlur(this, true);
  28. break;
  29. }
  30. return IntPtr.Zero;
  31. }
  32. public override void OnApplyTemplate()
  33. {
  34. base.OnApplyTemplate();
  35. EnableBlur(this, true);
  36. }
  37. private static void EnableBlur(Window window, bool isEnabled)
  38. {
  39. var versionInfo = SystemHelper.GetSystemVersionInfo();
  40. var accentPolicy = new InteropValues.ACCENTPOLICY();
  41. var accentPolicySize = Marshal.SizeOf(accentPolicy);
  42. accentPolicy.AccentFlags = 2;
  43. if (isEnabled)
  44. {
  45. if (versionInfo >= SystemVersionInfo.Windows10_1809)
  46. {
  47. accentPolicy.AccentState = InteropValues.ACCENTSTATE.ACCENT_ENABLE_ACRYLICBLURBEHIND;
  48. }
  49. else if (versionInfo >= SystemVersionInfo.Windows10)
  50. {
  51. accentPolicy.AccentState = InteropValues.ACCENTSTATE.ACCENT_ENABLE_BLURBEHIND;
  52. }
  53. else
  54. {
  55. accentPolicy.AccentState = InteropValues.ACCENTSTATE.ACCENT_ENABLE_TRANSPARENTGRADIENT;
  56. }
  57. }
  58. else
  59. {
  60. accentPolicy.AccentState = InteropValues.ACCENTSTATE.ACCENT_ENABLE_BLURBEHIND;
  61. }
  62. accentPolicy.GradientColor = ResourceHelper.GetResource<uint>(ResourceToken.BlurGradientValue);
  63. var accentPtr = Marshal.AllocHGlobal(accentPolicySize);
  64. Marshal.StructureToPtr(accentPolicy, accentPtr, false);
  65. var data = new InteropValues.WINCOMPATTRDATA
  66. {
  67. Attribute = InteropValues.WINDOWCOMPOSITIONATTRIB.WCA_ACCENT_POLICY,
  68. DataSize = accentPolicySize,
  69. Data = accentPtr
  70. };
  71. InteropMethods.Gdip.SetWindowCompositionAttribute(window.GetHandle(), ref data);
  72. Marshal.FreeHGlobal(accentPtr);
  73. }
  74. }