在WinUI 3中,我通过以下代码设置窗口的最大和最小尺寸时,拖动缩放一切正常,但是当我点击最大化按钮后,窗口的标题栏尺寸和内容区域尺寸不匹配!如图所示,这是怎么回事?
using Microsoft.UI.Xaml;
using System;
using System.Runtime.InteropServices;
using WinRT.Interop;
namespace App1
{
public sealed partial class MainWindow : Window
{
// 定义最小和最大尺寸
private const int MinWidth = 400;
private const int MinHeight = 300;
private const int MaxWidth = 900;
private const int MaxHeight = 600;
// 窗口过程委托和变量
private WndProc? _currentWndProcDelegate;
private delegate IntPtr WndProc(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);
public MainWindow()
{
InitializeComponent();
TestWindowMaxAndMinSize();
}
public void TestWindowMaxAndMinSize()
{
var hwnd = WindowNative.GetWindowHandle(this);
var originalWndProc = GetWindowLongPtr64(hwnd, -4);
_currentWndProcDelegate = (wndHwnd, msg, wParam, lParam) =>
{
if (msg == 0x0024)
{
var info = Marshal.PtrToStructure<MINMAXINFO>(lParam);
info.ptMinTrackSize.x = MinWidth;
info.ptMinTrackSize.y = MinHeight;
info.ptMaxTrackSize.x = MaxWidth;
info.ptMaxTrackSize.y = MaxHeight;
info.ptMaxSize.x = MaxWidth;
info.ptMaxSize.y = MaxHeight;
Marshal.StructureToPtr(info, lParam, true);
return IntPtr.Zero;
}
return CallWindowProc(originalWndProc, wndHwnd, msg, wParam, lParam);
};
SetWindowLongPtr64(hwnd, -4, Marshal.GetFunctionPointerForDelegate(_currentWndProcDelegate));
}
[StructLayout(LayoutKind.Sequential)]
public struct POINT
{
public int x;
public int y;
}
[StructLayout(LayoutKind.Sequential)]
public struct MINMAXINFO
{
public POINT ptReserved;
public POINT ptMaxSize;
public POINT ptMaxPosition;
public POINT ptMinTrackSize;
public POINT ptMaxTrackSize;
}
[DllImport("user32.dll")]
private static extern IntPtr CallWindowProc(IntPtr lpPrevWndFunc, IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll", EntryPoint = "GetWindowLongPtr")]
private static extern IntPtr GetWindowLongPtr64(IntPtr hWnd, int nIndex);
[DllImport("user32.dll", EntryPoint = "SetWindowLongPtr")]
private static extern IntPtr SetWindowLongPtr64(IntPtr hWnd, int nIndex, IntPtr dwNewLong);
}
}
