Skip to content

Commit

Permalink
fix some bugs
Browse files Browse the repository at this point in the history
  • Loading branch information
zhaotianff committed Jan 18, 2024
1 parent a73fd2a commit c5f5cca
Show file tree
Hide file tree
Showing 3 changed files with 131 additions and 80 deletions.
30 changes: 23 additions & 7 deletions src/BlurWindow/BlurWindow.cs
Original file line number Diff line number Diff line change
Expand Up @@ -206,15 +206,13 @@ public BlurWindow()
return;
blurBackgroundWindow.Width = b.NewSize.Width;
blurBackgroundWindow.Height = b.NewSize.Height;
this.Focus();
BringWindowToTop(this, blurBackgroundWindow);
};
this.StateChanged += (a, b) =>
{
if (blurBackgroundWindow == null)
return;
blurBackgroundWindow.WindowState = this.WindowState;
if(blurBackgroundWindow.WindowState == WindowState.Maximized)
{
blurBackgroundWindow.WindowState = WindowState.Normal;
Expand All @@ -229,8 +227,6 @@ public BlurWindow()
{
BeginBlurBackgroundAnimation();
}
this.Focus();
};
this.LocationChanged += (a, b) =>
{
Expand All @@ -239,7 +235,7 @@ public BlurWindow()
blurBackgroundWindow.Left = this.Left;
blurBackgroundWindow.Top = this.Top;
this.Focus();
BringWindowToTop(this, blurBackgroundWindow,true);
};

InitializeWindows1122H2Style();
Expand Down Expand Up @@ -275,11 +271,13 @@ internal async void ShowBlurBackground()
blurBackgroundWindow.Left = this.Left;
blurBackgroundWindow.Top = this.Top;
blurBackgroundWindow.Background = this.Background;
blurBackgroundWindow.Title = "BlurBackground";
this.Background = new SolidColorBrush() { Color = Colors.White, Opacity = 0 };
blurBackgroundWindow.AllowsTransparency = true;
blurBackgroundWindow.Show();
await Task.Delay(200);
this.Focus();
WindowHelper.HideWindowInSwitcher(blurBackgroundWindow);
BringWindowToTop(this, blurBackgroundWindow);
}

internal void CloseBlurBackground()
Expand Down Expand Up @@ -370,5 +368,23 @@ private void RestoreWindow(object sender, ExecutedRoutedEventArgs e)
{
SystemCommands.RestoreWindow(this);
}

private void BringWindowToTop(Window topWindow,Window bottomWindow,bool isMove = false)
{
//replace with winapi in some event
if(isMove)
{
this.Focus();
}
else
{
IntPtr topWindowPtr = new WindowInteropHelper(topWindow).Handle;
IntPtr bottomWindowPtr = IntPtr.Zero;
if (bottomWindow != null)
bottomWindowPtr = new WindowInteropHelper(bottomWindow).Handle;
WindowHelper.SetTopWindow(topWindowPtr, bottomWindowPtr);
}

}
}
}
Original file line number Diff line number Diff line change
@@ -1,73 +1,106 @@
using BlurWindow.Helpers;
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 TianXiaTech
{
internal struct ACCENTPOLICY
{
public int nAccentState;
public int nFlags;
public int nColor;
public int nAnimationId;
}

internal struct WINCOMPATTRDATA
{
public int nAttribute;
public IntPtr pData;
public int ulDataSize;
}

internal class WindowHelper
{
public const uint WM_SYSTEMMENU = 0xa4;
public const uint WP_SYSTEMMENU = 0x02;
public const uint WM_NCRBUTTONUP = 0x00A5;

[DllImport("user32.dll")]
public static extern int SetWindowCompositionAttribute(IntPtr hwnd, ref WINCOMPATTRDATA data);

private const int ACCENT_ENABLE_BLURBEHIND = 3;
private const int ACCENT_ENABLE_ACRYLICBLURBEHIND = 4;
private const int WCA_ACCENT_POLICY = 19;

public static void BlurWindow(System.Windows.Window window, int acrylicOpacity = 0)
{
var winhelp = new WindowInteropHelper(window);
bool isGreaterThanWin1122H2 = OsVersionHelper.IsGreaterThanWindows1122H2();

ACCENTPOLICY policy_Blur = new ACCENTPOLICY();
if (isGreaterThanWin1122H2)
{
policy_Blur.nAccentState = ACCENT_ENABLE_ACRYLICBLURBEHIND;
policy_Blur.nColor = (acrylicOpacity << 24) | (0xFFFFFF);
}
else
{
policy_Blur.nAccentState = ACCENT_ENABLE_BLURBEHIND;
policy_Blur.nColor = 0;
}

policy_Blur.nFlags = 0;
policy_Blur.nAnimationId = 0;

WINCOMPATTRDATA wINCOMPATTRDATA = new WINCOMPATTRDATA();
wINCOMPATTRDATA.nAttribute = WCA_ACCENT_POLICY;
IntPtr pData = Marshal.AllocHGlobal(Marshal.SizeOf(policy_Blur));
Marshal.StructureToPtr(policy_Blur, pData, false);
wINCOMPATTRDATA.pData = pData;
wINCOMPATTRDATA.ulDataSize = Marshal.SizeOf(policy_Blur);

SetWindowCompositionAttribute(winhelp.Handle, ref wINCOMPATTRDATA);

Marshal.FreeHGlobal(pData);
}
}
}
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 BlurWindow.Helpers
{
internal struct ACCENTPOLICY
{
public int nAccentState;
public int nFlags;
public int nColor;
public int nAnimationId;
}

internal struct WINCOMPATTRDATA
{
public int nAttribute;
public IntPtr pData;
public int ulDataSize;
}

internal class WindowHelper
{
public const uint WM_SYSTEMMENU = 0xa4;
public const uint WP_SYSTEMMENU = 0x02;
public const uint WM_NCRBUTTONUP = 0x00A5;

[DllImport("user32.dll")]
public static extern int SetWindowCompositionAttribute(IntPtr hwnd, ref WINCOMPATTRDATA data);

[DllImport("user32.dll")]
public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);

[DllImport("user32.dll")]
public static extern long GetWindowLong(IntPtr hWnd,int nIndex);

[DllImport("user32.dll")]
public static extern long SetWindowLong(IntPtr hWnd,int nIndex,long dwNewLong);


private const int ACCENT_ENABLE_BLURBEHIND = 3;
private const int ACCENT_ENABLE_ACRYLICBLURBEHIND = 4;
private const int WCA_ACCENT_POLICY = 19;

private static readonly IntPtr HWND_BOTTOM = (IntPtr)1;
private static readonly IntPtr HWND_TOP = (IntPtr)0;
private const uint SWP_NOMOVE = 0x0002;
private const uint SWP_NOSIZE = 0x0001;

private const long WS_EX_TOOLWINDOW = 0x00000080L;
private const int GWL_EXSTYLE = -20;

public static void BlurWindow(Window window, int acrylicOpacity = 0)
{
var winhelp = new WindowInteropHelper(window);
bool isGreaterThanWin1122H2 = OsVersionHelper.IsGreaterThanWindows1122H2();

ACCENTPOLICY policy_Blur = new ACCENTPOLICY();
if (isGreaterThanWin1122H2)
{
policy_Blur.nAccentState = ACCENT_ENABLE_ACRYLICBLURBEHIND;
policy_Blur.nColor = acrylicOpacity << 24 | 0xFFFFFF;
}
else
{
policy_Blur.nAccentState = ACCENT_ENABLE_BLURBEHIND;
policy_Blur.nColor = 0;
}

policy_Blur.nFlags = 0;
policy_Blur.nAnimationId = 0;

WINCOMPATTRDATA wINCOMPATTRDATA = new WINCOMPATTRDATA();
wINCOMPATTRDATA.nAttribute = WCA_ACCENT_POLICY;
IntPtr pData = Marshal.AllocHGlobal(Marshal.SizeOf(policy_Blur));
Marshal.StructureToPtr(policy_Blur, pData, false);
wINCOMPATTRDATA.pData = pData;
wINCOMPATTRDATA.ulDataSize = Marshal.SizeOf(policy_Blur);

SetWindowCompositionAttribute(winhelp.Handle, ref wINCOMPATTRDATA);

Marshal.FreeHGlobal(pData);
}

public static void SetTopWindow(IntPtr hwndTop, IntPtr hwndBottom)
{
if (hwndBottom != IntPtr.Zero)
SetWindowPos(hwndBottom, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
SetWindowPos(hwndTop, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
}

public static void HideWindowInSwitcher(Window window)
{
IntPtr hwnd = new WindowInteropHelper(window).Handle;
int exStyle = (int)GetWindowLong(hwnd, GWL_EXSTYLE);

exStyle |= (int)WS_EX_TOOLWINDOW;
SetWindowLong(hwnd, GWL_EXSTYLE, exStyle);
}
}
}
2 changes: 2 additions & 0 deletions src/BlurWindowDemo/MainWindow.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ private void InitializeDemoUI()
this.slider_Opacity.Visibility = Visibility.Collapsed;
this.lbl_Opacity.Visibility = Visibility.Collapsed;
this.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#01000000"));
this.cbx_BlurBackground.IsEnabled = false;
this.btn_SetBackground.IsEnabled = false;
}
}

Expand Down

0 comments on commit c5f5cca

Please sign in to comment.