C# WPF 自动调整大小 Window 当任务栏高度改变时

C# WPF Auto Resize Window When Taskbar Height Changed

我有一个 WPF window,它具有以下属性:

-ResizeMode=NoResize

-Window风格=None

我实现了普通 window 的所有功能,但我不知道如何让 window 在任务栏的高度发生变化时自动调整自身大小(当它最大化时)。 (如微软 Visual Studio 2017 Window)。

我可以手动最大化我的 window,但是如果我隐藏任务栏,我的 window 和屏幕底部之间会有一个空白 space。

工作区域改变时是否触发任何事件?

为您的 window 处理 WM_GETMINMAXINFO 消息,并做您需要做的任何事情 re-sizing

    public MainWindow()
    {
        InitializeComponent();
        SourceInitialized += new EventHandler(win_SourceInitialized);
    }

    private void win_SourceInitialized(object sender, EventArgs e)
    {
        System.IntPtr handle = (new WinInterop.WindowInteropHelper(this)).Handle;
        WinInterop.HwndSource.FromHwnd(handle).AddHook(new WinInterop.HwndSourceHook(WindowProc));
    }

    private const int WM_GETMINMAXINFO = 0x0024;
    private static System.IntPtr WindowProc(
          System.IntPtr hwnd,
          int msg,
          System.IntPtr wParam,
          System.IntPtr lParam,
          ref bool handled)
    {
        switch (msg)
        {
            case WM_GETMINMAXINFO: //https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-getminmaxinfo
                WmGetMinMaxInfo(hwnd, lParam); // <------  Do what you need to here   ---------->
                handled = true;
                break;
        }

        return (System.IntPtr)0;
    }

请注意,如果您是无边框的,not-resizable window,您可能还需要获取监视器信息(通过 Win32 GetMonitorInfo)并将您的应用程序限制在监视器的工作区域它开着。在我们的系统上,windows 无法正确调整 1900x1200 显示器的 window 大小(它太高了,所以我们必须根据显示器信息设置 MaxHeight,并注意如果通过继续观看 WM_GETMINMAXINFO 消息来调整任务栏的大小。

如果您也有这些问题,此博客可能会有所帮助:

https://blogs.msdn.microsoft.com/llobo/2006/08/01/maximizing-window-with-windowstylenone-considering-taskbar/

对于您的问题,您可以使用 SystemParameters.WorkArea。 最初设置 MainWindow 的 MaxHeight

MaxHeight="{Binding Height, Source={x:Static SystemParameters.WorkArea}}"

在 MainWindow 的代码隐藏中注册 SystemParameters.StaticPropertyChanged 以接收更改并更新您的 window 大小。

SystemParameters.StaticPropertyChanged += (sender, args) =>
{
    if (args.PropertyName == nameof(SystemParameters.WorkArea))
    {
         this.Dispatcher.Invoke(() =>
         {
             MaxHeight = SystemParameters.WorkArea.Height;
             Height = SystemParameters.WorkArea.Height;
             WindowState = WindowState.Normal;  // Updates the windows new sizes
             WindowState = WindowState.Maximized;
         });
    }
};