【问题标题】:Is it possible to specify the MaximizedBounds of a WPF window via PInvoke?是否可以通过 PInvoke 指定 WPF 窗口的 MaximizedBounds?
【发布时间】:2022-05-16 22:11:46
【问题描述】:

我的无边框 WPF 窗口出现问题。具体来说,它在窗口任务栏上方最大化,并且还以 -7 边距最大化,使窗口在每个方向上超出屏幕 7 个像素。

这在winforms中很容易通过设置窗口的MaximizedBounds属性来解决,但是WPF没有这个属性。

我尝试通过 WndProc 拦截最大化消息并手动设置大小/位置来解决此问题,但这会导致将 RestoreRegion 覆盖为最大化大小/位置,从而无法恢复窗口。

所以,我认为我可以通过 PInvoke 设置窗口的 MaximizedBounds。

This page 暗示它可以用 Win32 SetWindowPlacement 来完成...它需要一个称为 WINDOWPLACEMENT 的结构:

    [Serializable]
    [StructLayout(LayoutKind.Sequential)]
    public struct WINDOWPLACEMENT
    {
        public int length;
        public int flags;
        public int showCmd;
        public POINT minPosition;
        public POINT maxPosition;
        public RECT normalPosition;
    } 

我认为我只需要设置 Rectanle 和一个标志来指定它是用于 MaximizedBound 属性的,但是我在网上找不到任何这样的例子,而且我发现的标志都不像做到这一点。我在吠叫错误的树吗?如果是这样,是否有任何其他方法来指定我忽略的 MaximizedBound(或类似)?

【问题讨论】:

    标签: c# wpf pinvoke


    【解决方案1】:

    我会在走 P/Invoke 路线之前尝试这样的事情 - 我知道没有 WM_SETMINMAXINFO 消息,所以你可能需要覆盖你的 WinProc 来处理 WM_GETMINMAXINFO 和返回虚假数据......但无论如何,先试试这个,看看它是否适合你:

    public class ConstrainedWindow : Window
    {
        public ConstrainedWindow()
        {
            this.MaxHeight = SystemParameters.MaximizedPrimaryScreenHeight;
            this.MaxWidth = SystemParameters.MaximizedPrimaryScreenWidth;
        }
    
    }
    

    【讨论】:

    • 我已经尝试过你的第二个建议,但是由于 -7 边距,这导致窗口仍然向上和向左移动 7 个像素,并且 7 个像素太短而无法填充其余部分的屏幕。我最终使用了您的第一个建议,并覆盖了 WM_GETMINMAXINFO 以返回活动监视器的正确尺寸。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 2015-02-16
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    相关资源
    最近更新 更多