由于WinUI 3目前没有设置最小尺寸的功能,所以只能使用WM_GETMINMAXINFO。
WM_GETMINMAXINFO
如何在WinUI 3项目中使用**C#**指定WM_GETMINMAXINFO最小或最大窗口大小?我需要在App类或MainWindow类中设置它吗?先谢谢你了!
App
MainWindow
inb24sb21#
查看GitHub上的this示例。下面是一个WinUI 3窗口的完整示例,其中指定了最小和最大宽度和高度:
public sealed partial class MainWindow: Window { private static WinProc newWndProc = null; private static IntPtr oldWndProc = IntPtr.Zero; private delegate IntPtr WinProc(IntPtr hWnd, WindowMessage Msg, IntPtr wParam, IntPtr lParam); [DllImport("User32.dll")] internal static extern int GetDpiForWindow(IntPtr hwnd); [DllImport("user32.dll", EntryPoint = "SetWindowLong")] private static extern int SetWindowLong32(IntPtr hWnd, WindowLongIndexFlags nIndex, WinProc newProc); [DllImport("user32.dll", EntryPoint = "SetWindowLongPtr")] private static extern IntPtr SetWindowLongPtr64(IntPtr hWnd, WindowLongIndexFlags nIndex, WinProc newProc); [DllImport("user32.dll")] private static extern IntPtr CallWindowProc(IntPtr lpPrevWndFunc, IntPtr hWnd, WindowMessage Msg, IntPtr wParam, IntPtr lParam); public static int MinWindowWidth { get; set; } = 900; public static int MaxWindowWidth { get; set; } = 1800; public static int MinWindowHeight { get; set; } = 600; public static int MaxWindowHeight { get; set; } = 1600; public MainWindow() { this.InitializeComponent(); RegisterWindowMinMax(this); } private static void RegisterWindowMinMax(Window window) { var hwnd = GetWindowHandleForCurrentWindow(window); newWndProc = new WinProc(WndProc); oldWndProc = SetWindowLongPtr(hwnd, WindowLongIndexFlags.GWL_WNDPROC, newWndProc); } private static IntPtr GetWindowHandleForCurrentWindow(object target) => WinRT.Interop.WindowNative.GetWindowHandle(target); private static IntPtr WndProc(IntPtr hWnd, WindowMessage Msg, IntPtr wParam, IntPtr lParam) { switch (Msg) { case WindowMessage.WM_GETMINMAXINFO: var dpi = GetDpiForWindow(hWnd); var scalingFactor = (float)dpi / 96; var minMaxInfo = Marshal.PtrToStructure<MINMAXINFO>(lParam); minMaxInfo.ptMinTrackSize.x = (int)(MinWindowWidth * scalingFactor); minMaxInfo.ptMaxTrackSize.x = (int)(MaxWindowWidth * scalingFactor); minMaxInfo.ptMinTrackSize.y = (int)(MinWindowHeight * scalingFactor); minMaxInfo.ptMaxTrackSize.y = (int)(MaxWindowHeight * scalingFactor); Marshal.StructureToPtr(minMaxInfo, lParam, true); break; } return CallWindowProc(oldWndProc, hWnd, Msg, wParam, lParam); } private static IntPtr SetWindowLongPtr(IntPtr hWnd, WindowLongIndexFlags nIndex, WinProc newProc) { if (IntPtr.Size == 8) return SetWindowLongPtr64(hWnd, nIndex, newProc); else return new IntPtr(SetWindowLong32(hWnd, nIndex, newProc)); } private struct POINT { public int x; public int y; } [StructLayout(LayoutKind.Sequential)] private struct MINMAXINFO { public POINT ptReserved; public POINT ptMaxSize; public POINT ptMaxPosition; public POINT ptMinTrackSize; public POINT ptMaxTrackSize; } [Flags] private enum WindowLongIndexFlags : int { GWL_WNDPROC = -4, } private enum WindowMessage : int { WM_GETMINMAXINFO = 0x0024, } }
dy2hfwbg2#
如何在WinUI 3项目中使用C#指定WM_GETMINMAXINFO最小或最大窗口大小?在Changed方法中有一种方法可以检测当前应用程序窗口的真实的大小,如果大小很小或很大,则可以调用Resize方法来设置可用大小。这里是如何获取appwindow的文档。
Changed
2条答案
按热度按时间inb24sb21#
查看GitHub上的this示例。
下面是一个WinUI 3窗口的完整示例,其中指定了最小和最大宽度和高度:
dy2hfwbg2#
如何在WinUI 3项目中使用C#指定WM_GETMINMAXINFO最小或最大窗口大小?
在
Changed
方法中有一种方法可以检测当前应用程序窗口的真实的大小,如果大小很小或很大,则可以调用Resize方法来设置可用大小。这里是如何获取appwindow的文档。