mirror of
https://github.com/QL-Win/QuickLook.git
synced 2026-05-07 02:00:21 +08:00
Add Acrylic and Tabbed backdrop
This commit is contained in:
@@ -168,7 +168,7 @@ public static class WindowHelper
|
||||
Marshal.FreeHGlobal(accentPtr);
|
||||
}
|
||||
|
||||
public static void DisableBlur(Window window)
|
||||
public static void DisableDwmBlur(Window window)
|
||||
{
|
||||
var accent = new AccentPolicy();
|
||||
var accentStructSize = Marshal.SizeOf(accent);
|
||||
@@ -211,6 +211,11 @@ public static class WindowHelper
|
||||
|
||||
var hwnd = new WindowInteropHelper(window).Handle;
|
||||
|
||||
if (!window.AllowsTransparency && HwndSource.FromHwnd(hwnd) is HwndSource hwndSource)
|
||||
{
|
||||
hwndSource.CompositionTarget.BackgroundColor = Colors.Transparent;
|
||||
}
|
||||
|
||||
var isDarkThemeInt = isDarkTheme ? 1 : 0;
|
||||
Dwmapi.DwmSetWindowAttribute(hwnd, (uint)Dwmapi.WindowAttribute.UseImmersiveDarkMode, ref isDarkThemeInt, Marshal.SizeOf(typeof(bool)));
|
||||
|
||||
@@ -228,7 +233,17 @@ public static class WindowHelper
|
||||
|
||||
public static void EnableBackdropMicaBlur(Window window, bool isDarkTheme)
|
||||
{
|
||||
EnableDwmBlur(window, isDarkTheme, (uint)Dwmapi.WindowAttribute.SystembackdropType, (int)Dwmapi.SystembackdropType.MainWindow);
|
||||
EnableDwmBlur(window, isDarkTheme, (uint)Dwmapi.WindowAttribute.SystembackdropType, (int)Dwmapi.SystembackdropType.Mica);
|
||||
}
|
||||
|
||||
public static void EnableBackdropAcrylicBlur(Window window, bool isDarkTheme)
|
||||
{
|
||||
EnableDwmBlur(window, isDarkTheme, (uint)Dwmapi.WindowAttribute.SystembackdropType, (int)Dwmapi.SystembackdropType.Acrylic);
|
||||
}
|
||||
|
||||
public static void EnableBackdropTabbedBlur(Window window, bool isDarkTheme)
|
||||
{
|
||||
EnableDwmBlur(window, isDarkTheme, (uint)Dwmapi.WindowAttribute.SystembackdropType, (int)Dwmapi.SystembackdropType.Tabbed);
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
|
||||
@@ -41,9 +41,12 @@ public static class Dwmapi
|
||||
{
|
||||
Auto = 0,
|
||||
None = 1,
|
||||
MainWindow = 2,
|
||||
TransientWindow = 3,
|
||||
TabbedWindow = 4,
|
||||
Mica = 2,
|
||||
Acrylic = 3, // Automatically selects the best Acrylic effect available on the system (Acrylic11 > Acrylic10)
|
||||
Tabbed = 4,
|
||||
|
||||
Acrylic10, // Windows 10 style, supported on Windows 10 and 11
|
||||
Acrylic11, // Windows 11 style, supported on Windows 11 22523+ (Insider) and 22621+ (Stable)
|
||||
}
|
||||
|
||||
[DllImport("DwmApi.dll")]
|
||||
|
||||
+126
-19
@@ -27,6 +27,7 @@ using System.Windows.Input;
|
||||
using System.Windows.Media.Animation;
|
||||
using System.Windows.Shell;
|
||||
using Wpf.Ui.Violeta.Controls;
|
||||
using static QuickLook.Common.NativeMethods.Dwmapi;
|
||||
using Brush = System.Windows.Media.Brush;
|
||||
using FontFamily = System.Windows.Media.FontFamily;
|
||||
using Size = System.Windows.Size;
|
||||
@@ -157,6 +158,12 @@ public partial class ViewerWindow : Window
|
||||
base.Close();
|
||||
}
|
||||
|
||||
protected override void OnSourceInitialized(EventArgs e)
|
||||
{
|
||||
base.OnSourceInitialized(e);
|
||||
ApplyWindowBackgroundEffects();
|
||||
}
|
||||
|
||||
public override void OnApplyTemplate()
|
||||
{
|
||||
base.OnApplyTemplate();
|
||||
@@ -171,31 +178,14 @@ public partial class ViewerWindow : Window
|
||||
var useTransparency = SettingHelper.Get("UseTransparency", true)
|
||||
&& SystemParameters.IsGlassEnabled
|
||||
&& !App.IsGPUInBlacklist;
|
||||
var backdrop = GetBackdropOption();
|
||||
|
||||
var windowChrome = WindowChrome.GetWindowChrome(this);
|
||||
windowChrome?.GlassFrameThickness = useTransparency ? new Thickness(1) : new Thickness(0);
|
||||
|
||||
if (useTransparency)
|
||||
{
|
||||
if (App.IsWin11)
|
||||
{
|
||||
if (Environment.OSVersion.Version >= new Version(10, 0, 22523))
|
||||
{
|
||||
WindowHelper.EnableBackdropMicaBlur(this, CurrentTheme == Themes.Dark);
|
||||
}
|
||||
else
|
||||
{
|
||||
WindowHelper.EnableMicaBlur(this, CurrentTheme == Themes.Dark);
|
||||
}
|
||||
}
|
||||
else if (App.IsWin10)
|
||||
{
|
||||
WindowHelper.EnableBlur(this);
|
||||
}
|
||||
else
|
||||
{
|
||||
Background = (Brush)FindResource("MainWindowBackgroundNoTransparent");
|
||||
}
|
||||
ApplyBackdrop(backdrop);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -216,6 +206,123 @@ public partial class ViewerWindow : Window
|
||||
}
|
||||
}
|
||||
|
||||
private void ApplyBackdrop(SystembackdropType backdrop)
|
||||
{
|
||||
switch (backdrop)
|
||||
{
|
||||
case SystembackdropType.None:
|
||||
Background = (Brush)FindResource("MainWindowBackgroundNoTransparent");
|
||||
break;
|
||||
|
||||
case SystembackdropType.Mica:
|
||||
if (App.IsWin11)
|
||||
{
|
||||
if (Environment.OSVersion.Version >= new Version(10, 0, 22523))
|
||||
{
|
||||
WindowHelper.DisableDwmBlur(this);
|
||||
WindowHelper.EnableBackdropMicaBlur(this, CurrentTheme == Themes.Dark);
|
||||
}
|
||||
else
|
||||
{
|
||||
WindowHelper.DisableDwmBlur(this);
|
||||
WindowHelper.EnableMicaBlur(this, CurrentTheme == Themes.Dark);
|
||||
}
|
||||
}
|
||||
else if (App.IsWin10)
|
||||
{
|
||||
WindowHelper.DisableDwmBlur(this);
|
||||
WindowHelper.EnableBlur(this);
|
||||
}
|
||||
else
|
||||
{
|
||||
Background = (Brush)FindResource("MainWindowBackgroundNoTransparent");
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case SystembackdropType.Acrylic:
|
||||
if (App.IsWin11 && Environment.OSVersion.Version >= new Version(10, 0, 22523))
|
||||
{
|
||||
WindowHelper.DisableDwmBlur(this);
|
||||
WindowHelper.EnableBackdropAcrylicBlur(this, CurrentTheme == Themes.Dark);
|
||||
}
|
||||
else if (App.IsWin10)
|
||||
{
|
||||
WindowHelper.DisableDwmBlur(this);
|
||||
WindowHelper.EnableBlur(this);
|
||||
}
|
||||
else
|
||||
{
|
||||
Background = (Brush)FindResource("MainWindowBackgroundNoTransparent");
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case SystembackdropType.Tabbed:
|
||||
if (App.IsWin11 && Environment.OSVersion.Version >= new Version(10, 0, 22523))
|
||||
{
|
||||
WindowHelper.DisableDwmBlur(this);
|
||||
WindowHelper.EnableBackdropTabbedBlur(this, CurrentTheme == Themes.Dark);
|
||||
}
|
||||
else if (App.IsWin10)
|
||||
{
|
||||
WindowHelper.DisableDwmBlur(this);
|
||||
WindowHelper.EnableBlur(this);
|
||||
}
|
||||
else
|
||||
{
|
||||
Background = (Brush)FindResource("MainWindowBackgroundNoTransparent");
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case SystembackdropType.Auto:
|
||||
default:
|
||||
if (App.IsWin11)
|
||||
{
|
||||
if (Environment.OSVersion.Version >= new Version(10, 0, 22523))
|
||||
{
|
||||
WindowHelper.DisableDwmBlur(this);
|
||||
WindowHelper.EnableBackdropMicaBlur(this, CurrentTheme == Themes.Dark);
|
||||
}
|
||||
else
|
||||
{
|
||||
WindowHelper.DisableDwmBlur(this);
|
||||
WindowHelper.EnableMicaBlur(this, CurrentTheme == Themes.Dark);
|
||||
}
|
||||
}
|
||||
else if (App.IsWin10)
|
||||
{
|
||||
WindowHelper.DisableDwmBlur(this);
|
||||
WindowHelper.EnableBlur(this);
|
||||
}
|
||||
else
|
||||
{
|
||||
Background = (Brush)FindResource("MainWindowBackgroundNoTransparent");
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private static SystembackdropType GetBackdropOption()
|
||||
{
|
||||
var option = SettingHelper.Get("WindowBackdrop", nameof(SystembackdropType.Auto), "QuickLook")?.Trim();
|
||||
|
||||
if (string.IsNullOrEmpty(option))
|
||||
return SystembackdropType.Auto;
|
||||
|
||||
if (string.Equals(option, nameof(SystembackdropType.Acrylic), StringComparison.OrdinalIgnoreCase))
|
||||
return SystembackdropType.Acrylic;
|
||||
|
||||
if (string.Equals(option, nameof(SystembackdropType.Tabbed), StringComparison.OrdinalIgnoreCase))
|
||||
return SystembackdropType.Tabbed;
|
||||
|
||||
return Enum.TryParse(option, true, out SystembackdropType parsed)
|
||||
? parsed
|
||||
: SystembackdropType.Auto;
|
||||
}
|
||||
|
||||
private void SaveWindowSizeOnSizeChanged(object sender, SizeChangedEventArgs e)
|
||||
{
|
||||
// first shown?
|
||||
|
||||
Reference in New Issue
Block a user