diff --git a/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs b/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs index 2c6425e26c..36ee37c35a 100644 --- a/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs +++ b/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs @@ -921,6 +921,9 @@ namespace Avalonia.Win32.Interop [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode, EntryPoint = "SetWindowTextW")] public static extern bool SetWindowText(IntPtr hwnd, string lpString); + + [DllImport("uxtheme.dll", SetLastError = true, CharSet = CharSet.Unicode)] + public static extern HRESULT SetWindowTheme(IntPtr hwnd, string subAppName, string subIdList); public enum ClassLongIndex : int { diff --git a/src/Windows/Avalonia.Win32/WindowImpl.cs b/src/Windows/Avalonia.Win32/WindowImpl.cs index 2ae200a179..1946f04b16 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.cs @@ -968,26 +968,20 @@ namespace Avalonia.Win32 { var oldDecorated = _decorated; - var oldThickness = BorderThickness; - change(); var style = (WindowStyles)GetWindowLong(_hwnd, (int)WindowLongParam.GWL_STYLE); - const WindowStyles controlledFlags = WindowStyles.WS_OVERLAPPEDWINDOW; - - style = style | controlledFlags ^ controlledFlags; - style |= WindowStyles.WS_OVERLAPPEDWINDOW; if (!_decorated) { - style ^= (WindowStyles.WS_CAPTION | WindowStyles.WS_SYSMENU); + style &= ~WindowStyles.WS_SYSMENU; } if (!_resizable) { - style ^= (WindowStyles.WS_SIZEFRAME); + style &= ~WindowStyles.WS_SIZEFRAME; } GetClientRect(_hwnd, out var oldClientRect); @@ -995,7 +989,6 @@ namespace Avalonia.Win32 ClientToScreen(_hwnd, ref oldClientRectOrigin); oldClientRect.Offset(oldClientRectOrigin); - SetWindowLong(_hwnd, (int)WindowLongParam.GWL_STYLE, (uint)style); UnmanagedMethods.GetWindowRect(_hwnd, out var windowRect); @@ -1004,8 +997,16 @@ namespace Avalonia.Win32 { var newRect = oldClientRect; if (_decorated) - AdjustWindowRectEx(ref newRect, (uint)style, false, - GetWindowLong(_hwnd, (int)WindowLongParam.GWL_EXSTYLE)); + { + SetWindowTheme(_hwnd, null, null); + AdjustWindowRectEx( + ref newRect, (uint)style, false, GetWindowLong(_hwnd, (int)WindowLongParam.GWL_EXSTYLE)); + } + else + { + SetWindowTheme(_hwnd, "", ""); + } + SetWindowPos(_hwnd, IntPtr.Zero, newRect.left, newRect.top, newRect.Width, newRect.Height, SetWindowPosFlags.SWP_NOZORDER | SetWindowPosFlags.SWP_NOACTIVATE | SetWindowPosFlags.SWP_FRAMECHANGED); frameUpdated = true;