Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可以通过PInvoke指定WPF窗口的最大化边界?_C#_Wpf_Pinvoke - Fatal编程技术网

C# 是否可以通过PInvoke指定WPF窗口的最大化边界?

C# 是否可以通过PInvoke指定WPF窗口的最大化边界?,c#,wpf,pinvoke,C#,Wpf,Pinvoke,我的无边界WPF窗口有问题。具体来说,它最大化了windows任务栏的顶部,也最大化了-7边距,使窗口在每个方向上超出屏幕7个像素 在winforms中,通过设置窗口的MaximizedBounds属性可以很容易地解决这个问题,但是WPF没有这个属性 我试图通过WndProc截取最大化消息并手动设置大小/位置来解决此问题,但这会导致将恢复区域覆盖到最大化大小/位置,从而无法恢复窗口 所以,我想我可以通过PInvoke设置窗口的最大边界 意味着它可以通过Win32 SetWindowPlaceme

我的无边界WPF窗口有问题。具体来说,它最大化了windows任务栏的顶部,也最大化了-7边距,使窗口在每个方向上超出屏幕7个像素

在winforms中,通过设置窗口的MaximizedBounds属性可以很容易地解决这个问题,但是WPF没有这个属性

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

所以,我想我可以通过PInvoke设置窗口的最大边界

意味着它可以通过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;
    } 

我想我只需要设置矩形和一个标志来指定它是用于MaximizedBound属性的,但是我在网上找不到任何这样的例子,而且我找到的标志中没有一个可以实现这一点。我找错树了吗?如果是这样的话,有没有其他方法来指定我忽略的最大化界限(或类似的界限)?

在进入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以返回活动监视器的正确维度。谢谢