防止Winform窗体最大化?

11

我希望防止我的桌面应用程序被最大化。它不应该通过任何手段变得最大化 - 通过双击标题栏,或通过在键盘上单击Windows + Up箭头等。

-> 我禁用了 MaximizeBoxMinimizeBox
-> 我还为我的WinForm设置了 MaximumSizeMinimumSize

但是当我按Windows + Up箭头时,我的窗体会移动到屏幕左上角,也就是说它被最大化了。所以请告诉我如何防止这种情况发生...


3
考虑再创建一个问题,用于你的第二个关于快捷方式的问题。 - emartel
我也做过这个,而且我在谷歌上找到了所有答案。你需要将一些属性设置为false,一些属性需要重写。 - Pavenhimself
10个回答

15
实际上这里存在两个完全分开的问题。从功能角度来看,它们看起来基本相同,但从实施模型的角度来看(正如Windows自己通常使用的方式),它们是不相关的。
就像其他人所回答的那样,您可以通过将其MaximizeBox属性设置为false 来防止窗体最大化。这会删除窗体底层窗口上的WS_MAXIMIZEBOX 样式,从而防止窗口管理器允许窗口被最大化。 它会禁用窗口标题栏上的最大化框(在最小化框和关闭框之间的那个),禁用窗口/系统菜单上的“最大化”选项以及任何我可能忘记的最大化窗口的其他方法。
然而,这与Win+键盘快捷键无关,后者调用与将窗口拖到屏幕边缘的魔法位置相同的Aero Snap。窗口管理器,无论是由于Aero Snap的错误还是特性,仍然允许您有效地“最大化”不应该被最大化的窗口。设置MaximizeBox属性对此没有影响,因此,如果您真正想防止用户以这种方式更改窗口大小,则需要禁用Aero Snap对您的窗口的影响。

很遗憾,至少目前我所知道的方法中没有可编程地按窗口或进程禁用Aero Snap的方式(也请参见此相关问题)。如果用户启用了Aero Snap,则可以认为他们想要这种行为,并且应用程序不应该干扰它。你唯一能做的就是完全禁用调整窗口大小。在WinForms中,你可以通过设置FormBorderStyle属性为以下之一来实现: FormBorderStyle.FixedSingle, FormBorderStyle.Fixed3D, 或 FormBorderStyle.FixedDialog。如果你仍然希望以其他方式调整你的窗口大小,你需要编写代码来手动处理,这不是一个特别容易的任务。

因此,我鼓励你非常谨慎地考虑是否真的有必要这样做。所有其他不可最大化的窗口都可以通过设置 MaximizeBox 属性(或在其UI框架中执行相当操作)来实现,这意味着它们仍然可以通过Aero Snap有效地最大化。如果这对所有其他窗口都起作用,包括Windows自身的窗口,那么它可能也适用于你。


1
我在寻找类似答案时遇到了这个问题,将MaximizeBox设置为false似乎可以防止最大化的任何路径。我猜这个问题在现在和发布这个答案之间已经得到解决了。或者是我错过了什么? - Karlovsky120

10
表单有一个名为MaximizeBox的属性 - 把它设为false。
关于您的第二个问题,请查看这个问题及其答案,了解在WinForms中实现键盘快捷键的最佳方法。

2
MaximizeBox = false 不会阻止 Windows + Up Arrow 快捷键最大化任何窗口... 如果我没记错的话,因为我在我的应用程序中遇到了同样的问题... - Benison Sam
你也可以禁用 Windows + Up 快捷键,然后专注于使其他所有键盘快捷键可用。 - dsgriffin
应该可以工作,但实际上并没有。强制执行可能会起作用,https://stackoverflow.com/a/47994707/17034 - Hans Passant

6
this.FormBorderStyle = FormBorderStyle.FixedSingle;

这行代码将防止用户调整窗口大小。

除此之外,您还需要隐藏/禁用最大化框,并且这样做应该可以满足您的要求。

使用以下代码来禁用最大化框

this.MaximizeBox = false;

如果要隐藏最大化按钮,也可以使用以下代码

this.MinimizeBox = false;

如果将Maximize和Minimize设置为false,则按钮将消失。

伙计,这个可以做到,但我有一个自定义表单,其FormBorderStyle = FormBorderStyle.None。还有其他方法可以实现吗? - Benison Sam
你可以禁用'WINKEY + UP'组合键来防止窗口最大化。此外,我会将最大/最小尺寸设置为固定值。这个解决方案似乎很不好,但如果你的要求是'FormBorderStyle.None'选项,那么这可能是你最好的选择。 - Andre Fly

2
您可以通过设置以下内容来防止窗口捕捉到左上角:

您可以通过设置以下内容来防止窗口捕捉到左上角:

private void toolbox_Move(object sender, EventArgs e)
{
    this.WindowState = FormWindowState.Normal;
}

在表单的移动事件中。

2

将MaximumSize设置为至少与Size(或某个尺寸)相等可以防止窗口全屏。它仍然会捕捉到左上角,但至少它是一个窗口,并且看起来正确 - 就像是Windows变傻了而不是你的程序。


你可能还需要设置最小尺寸。对我来说,如果最小和最大值不相等,Win+Up 仍然会影响大小。我创建了一个 LockSize()UnlockSize() 来进行调整大小。Lock() 将最小和最大值都设置为当前大小,而 Unlock() 则将最小值设置为 真正的最小值,而最大值则被设置为任意大的数字。 - DCOPTimDowd

1
你可以尝试使用RegisterHotKey Win+Up,如果你的窗口或应用程序已被激活,则可以取消注册此热键。你必须捕获热键并返回适当的值以防止进一步处理。
请查看WM_ACTIVATEAPP、WM_ACTIVATE和WM_NCACTIVATE。如果你想禁用所有窗口的Win+UP,可以使用第一个。

1

Form类有一个名为“MaximumBox”的属性,您必须在窗体的属性窗口中将其设置为False...这实际上会禁用窗体通过任何方式进行最大化...此外,如果您想控制窗体大小,可以使用诸如“MinimumSize,MaximumSize”之类的属性,根据您的意愿设置它们的值或为MaximumSizeChanged和MinimumSizeChanged事件创建事件处理程序...


这个东西不起作用,伙计... 窗口会像在32位Windows操作系统上尝试最大化16位dos应用程序时一样移动到左上角... 它只是移到左上角,然后拒绝任何移动,就像最大化任何窗口一样... 我的意思是大小保持不变,但所有其他属性与任何正常窗口最大化时相同... 有没有什么方法可以解决这个问题...? - Benison Sam

1
设置窗体边框样式为固定单个。
Maximizebox=false

将maximumsize设置为winform默认大小

例如,如果大小为(646,385),则设置maximumsize为(646,385)


0

很简单!应用以下代码以在触发调整大小事件时将窗口状态保持为正常。

protected override void OnResize(EventArgs e) {
    base.OnResize(e);
    WindowState = FormWindowState.Normal;
}

0

你可以做的一件事是将MaximumSize和MinimumSize设置为相同的值,但不是0,0。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接