mirror of
https://github.com/Flow-Launcher/Flow.Launcher.git
synced 2026-03-11 08:54:32 +00:00
Use PInvoke.DwmSetWindowAttribute instead of DllImport
This commit is contained in:
parent
e4ade45d83
commit
db37ab7373
3 changed files with 35 additions and 50 deletions
|
|
@ -12,8 +12,6 @@ using System.Windows.Shell;
|
|||
using Flow.Launcher.Infrastructure;
|
||||
using Flow.Launcher.Infrastructure.Logger;
|
||||
using Flow.Launcher.Infrastructure.UserSettings;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Windows.Interop;
|
||||
using Microsoft.Win32;
|
||||
using Flow.Launcher.Plugin;
|
||||
using TextBox = System.Windows.Controls.TextBox;
|
||||
|
|
@ -70,43 +68,11 @@ namespace Flow.Launcher.Core.Resource
|
|||
}
|
||||
|
||||
#region Blur Handling
|
||||
private const int DWMWA_WINDOW_CORNER_PREFERENCE = 33;
|
||||
public enum DWM_WINDOW_CORNER_PREFERENCE
|
||||
{
|
||||
Default = 0,
|
||||
DoNotRound = 1,
|
||||
Round = 2,
|
||||
RoundSmall = 3
|
||||
}
|
||||
[DllImport("dwmapi.dll")]
|
||||
private static extern int DwmSetWindowAttribute(IntPtr hwnd, int dwAttribute, ref DWM_WINDOW_CORNER_PREFERENCE pvAttribute, int cbAttribute);
|
||||
public static void SetWindowCornerPreference(System.Windows.Window window, DWM_WINDOW_CORNER_PREFERENCE preference)
|
||||
{
|
||||
IntPtr hWnd = new WindowInteropHelper(window).Handle;
|
||||
DwmSetWindowAttribute(hWnd, DWMWA_WINDOW_CORNER_PREFERENCE, ref preference, sizeof(int));
|
||||
}
|
||||
|
||||
private Window GetMainWindow()
|
||||
{
|
||||
return Application.Current.Dispatcher.Invoke(() => Application.Current.MainWindow);
|
||||
}
|
||||
|
||||
public void RefreshFrame()
|
||||
{
|
||||
Application.Current.Dispatcher.Invoke(() =>
|
||||
{
|
||||
Window mainWindow = Application.Current.MainWindow;
|
||||
if (mainWindow == null)
|
||||
return;
|
||||
|
||||
IntPtr mainWindowPtr = new WindowInteropHelper(mainWindow).Handle;
|
||||
if (mainWindowPtr == IntPtr.Zero)
|
||||
return;
|
||||
|
||||
HwndSource mainWindowSrc = HwndSource.FromHwnd(mainWindowPtr);
|
||||
if (mainWindowSrc == null)
|
||||
return;
|
||||
|
||||
// Remove OS minimizing/maximizing animation
|
||||
// Methods.SetWindowAttribute(new WindowInteropHelper(mainWindow).Handle, DWMWINDOWATTRIBUTE.DWMWA_TRANSITIONS_FORCEDISABLED, 3);
|
||||
|
||||
|
|
@ -124,7 +90,7 @@ namespace Flow.Launcher.Core.Resource
|
|||
}, DispatcherPriority.Normal);
|
||||
}
|
||||
|
||||
public void AutoDropShadow()
|
||||
private void AutoDropShadow()
|
||||
{
|
||||
SetWindowCornerPreference("Default");
|
||||
RemoveDropShadowEffectFromCurrentTheme();
|
||||
|
|
@ -153,24 +119,15 @@ namespace Flow.Launcher.Core.Resource
|
|||
}
|
||||
}
|
||||
|
||||
public void SetWindowCornerPreference(string cornerType)
|
||||
private void SetWindowCornerPreference(string cornerType)
|
||||
{
|
||||
Application.Current.Dispatcher.Invoke(() =>
|
||||
{
|
||||
System.Windows.Window mainWindow = GetMainWindow();
|
||||
Window mainWindow = Application.Current.MainWindow;
|
||||
if (mainWindow == null)
|
||||
return;
|
||||
|
||||
DWM_WINDOW_CORNER_PREFERENCE preference = cornerType switch
|
||||
{
|
||||
"DoNotRound" => DWM_WINDOW_CORNER_PREFERENCE.DoNotRound,
|
||||
"Round" => DWM_WINDOW_CORNER_PREFERENCE.Round,
|
||||
"RoundSmall" => DWM_WINDOW_CORNER_PREFERENCE.RoundSmall,
|
||||
"Default" => DWM_WINDOW_CORNER_PREFERENCE.Default,
|
||||
_ => DWM_WINDOW_CORNER_PREFERENCE.Default,
|
||||
};
|
||||
|
||||
SetWindowCornerPreference(mainWindow, preference);
|
||||
Win32Helper.DWMSetCornerPreferenceForWindow(mainWindow, cornerType);
|
||||
}, DispatcherPriority.Normal);
|
||||
}
|
||||
|
||||
|
|
@ -189,7 +146,7 @@ namespace Flow.Launcher.Core.Resource
|
|||
if (windowBorderStyle == null)
|
||||
return;
|
||||
|
||||
Window mainWindow = GetMainWindow();
|
||||
Window mainWindow = Application.Current.MainWindow;
|
||||
if (mainWindow == null)
|
||||
return;
|
||||
|
||||
|
|
@ -309,7 +266,7 @@ namespace Flow.Launcher.Core.Resource
|
|||
}, DispatcherPriority.Render);
|
||||
}
|
||||
|
||||
public void ColorizeWindow(string Mode)
|
||||
private void ColorizeWindow(string mode)
|
||||
{
|
||||
Application.Current.Dispatcher.Invoke(() =>
|
||||
{
|
||||
|
|
|
|||
|
|
@ -19,4 +19,5 @@ WM_SYSKEYUP
|
|||
EnumWindows
|
||||
|
||||
DwmSetWindowAttribute
|
||||
DWM_SYSTEMBACKDROP_TYPE
|
||||
DWM_SYSTEMBACKDROP_TYPE
|
||||
DWM_WINDOW_CORNER_PREFERENCE
|
||||
|
|
@ -46,6 +46,33 @@ namespace Flow.Launcher.Infrastructure
|
|||
(uint)Marshal.SizeOf<int>()).Succeeded;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="window"></param>
|
||||
/// <param name="cornerType">DoNotRound, Round, RoundSmall, Default</param>
|
||||
/// <returns></returns>
|
||||
public static unsafe bool DWMSetCornerPreferenceForWindow(Window window, string cornerType)
|
||||
{
|
||||
var windowHelper = new WindowInteropHelper(window);
|
||||
windowHelper.EnsureHandle();
|
||||
|
||||
var preference = cornerType switch
|
||||
{
|
||||
"DoNotRound" => DWM_WINDOW_CORNER_PREFERENCE.DWMWCP_DONOTROUND,
|
||||
"Round" => DWM_WINDOW_CORNER_PREFERENCE.DWMWCP_ROUND,
|
||||
"RoundSmall" => DWM_WINDOW_CORNER_PREFERENCE.DWMWCP_ROUNDSMALL,
|
||||
"Default" => DWM_WINDOW_CORNER_PREFERENCE.DWMWCP_DEFAULT,
|
||||
_ => throw new InvalidOperationException("Invalid corner type")
|
||||
};
|
||||
|
||||
return PInvoke.DwmSetWindowAttribute(
|
||||
new(windowHelper.Handle),
|
||||
DWMWINDOWATTRIBUTE.DWMWA_WINDOW_CORNER_PREFERENCE,
|
||||
&preference,
|
||||
(uint)Marshal.SizeOf<int>()).Succeeded;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Backdrop
|
||||
|
|
|
|||
Loading…
Reference in a new issue