I'm creating a demo app using WinUI 3 prerelease 0.5 (project reunion).
I would like to maximize, minimize, and restore the window state from c# managed code. Are there any examples available?
I'm creating a demo app using WinUI 3 prerelease 0.5 (project reunion).
I would like to maximize, minimize, and restore the window state from c# managed code. Are there any examples available?
Apparently this is not possible using managed code at this time. PInvoke is the only option currenlty. I used PInvoke.User32 nuget package.
AppWindow.Presenter
to maximize/minimize the window. –
Luca Use AppWindow
class from Windows App SDK
// Retrieve the window handle (HWND) of the current (XAML) WinUI 3 window.
IntPtr hWnd = WinRT.Interop.WindowNative.GetWindowHandle(this);
// Retrieve the WindowId that corresponds to hWnd.
WindowId windowId = Win32Interop.GetWindowIdFromWindow(hWnd);
// Lastly, retrieve the AppWindow for the current (XAML) WinUI 3 window.
AppWindow appWindow = AppWindow.GetFromWindowId(windowId);
appWindow.Closing += AppWindow_Closing;
private void AppWindow_Closing(AppWindow sender, AppWindowClosingEventArgs args)
{
args.Cancel = true;
}
https://learn.microsoft.com/en-us/windows/apps/windows-app-sdk/windowing/windowing-overview
This is now possible using the Microsoft.UI.Windowing.OverlappedPresenter
class. Your app window can be of different kinds, by default it's usually this one. Here's how you can use it from your code:
// Assuming you have a reference to your window (currentWindow)
if (currentWindow.AppWindow.Presenter is OverlappedPresenter presenter)
{
presenter.Restore();
presenter.Minimize();
presenter.Maximize();
}
Here is my implementation based on the PInvoke.User32 nuget package.
Version using Window parameter
public void MaximizeWindow(Window window)
{
var windowHandle = WinRT.Interop.WindowNative.GetWindowHandle(window);
PInvoke.User32.ShowWindow(windowHandle, PInvoke.User32.WindowShowStyle.SW_MAXIMIZE);
}
Version using extension method
This previous code can also be transformed into an extension method for the Window
class, so I can just call this.Maximize()
from within the Window
:
public static class WindowExtensions
{
public static void Maximize(this Window window)
{
var windowHandle = WinRT.Interop.WindowNative.GetWindowHandle(window);
PInvoke.User32.ShowWindow(windowHandle, PInvoke.User32.WindowShowStyle.SW_MAXIMIZE);
}
}
Usage in your Window derived class:
this.Maximize();
Minize and Restore
The "PInvoke.User32.WindowShowStyle" definition used in the examples above contains also constants for SW_MINIMIZE
and SW_RESTORE
, but I did not test this.
If you just want to maximize a window you may use this minimal class without including PInvoke.User32
using System;
using System.Runtime.InteropServices;
namespace JimPrototypes2.Services
{
class PInvoke
{
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool ShowWindow(IntPtr hWnd, WindowShowStyle nCmdShow);
// Full enum def is at https://github.com/dotnet/pinvoke/blob/main/src/User32/User32+WindowShowStyle.cs
public enum WindowShowStyle : uint
{
SW_MAXIMIZE = 3,
}
public static void MaximizeWindow(IntPtr hWnd)
{
ShowWindow(hWnd, WindowShowStyle.SW_MAXIMIZE);
}
}
}
Usage:
IntPtr hWnd = (IntPtr)WinRT.Interop.WindowNative.GetWindowHandle(App.Window);
PInvoke.MaximizeWindow(hWnd);
© 2022 - 2025 — McMap. All rights reserved.