【问题标题】:Preventing Winform from being maximized?防止Winform被最大化?
【发布时间】:2012-11-03 02:02:36
【问题描述】:

我想阻止我的桌面应用程序被最大化。它不应该以任何方式最大化 - 通过双击标题栏,或通过单击键盘上的 Windows + 向上箭头等。

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

仍然当我按 Windows + 向上 箭头时,我的 win 表单移到屏幕的左上角,我的意思是它被最大化了。 所以请告诉我有什么办法可以防止这种事情发生...

【问题讨论】:

  • 考虑为您关于快捷方式的第二个问题创建另一个问题
  • 这个我也做过,都是在google上找到的。有些属性需要设置为 false,有些需要覆盖。

标签: c# .net windows winforms


【解决方案1】:

表单有一个名为 MaximizeBox 的属性 - 将其设置为 false。

关于您的第二个问题,请查看this question and it's answers,了解在 WinForms 中实现键盘快捷键的最佳方法。

【讨论】:

  • MaximizeBox = false 不会停止 Windows + 向上箭头快捷键以最大化任何窗口...如果我没记错的话,因为我在我的应用程序中面临同样的问题....
  • 您也可以随时禁用 Windows + Up 快捷键,然后专注于使所有其他键盘快捷键都可以使用..
  • 应该工作,但它没有。锤击它,stackoverflow.com/a/47994707/17034
【解决方案2】:

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

【讨论】:

  • 这东西不工作伙计.. 窗口正在移动到左上角,就像您尝试在 32 位 Windows 操作系统上最大化基于 16 位 dos 的应用程序时一样... 它只是转到左上角然后拒绝任何移动,例如当您最大化任何窗口时......我的意思是大小保持不变,但所有其他属性与任何普通窗口最大化时相同......有没有办法解决这个问题...??
【解决方案3】:
this.FormBorderStyle = FormBorderStyle.FixedSingle;

该行代码将阻止用户重新调整窗口大小。

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

要禁用最大化框,请使用此

this.MaximizeBox = false;

要隐藏最大化框,也可以使用它

this.MinimizeBox = false;

如果将最大化和最小化设置为 false,则按钮会消失。

【讨论】:

  • 伙计,这会做,但我有一个 FormBorderStyle = FormBorderStyle.None 的自定义表单。有没有其他方法可以做到这一点...
  • 您可以抑制“WINKEY + UP”组合以防止最大化窗口。除此之外,我会将最大/最小尺寸设置为固定值。这个解决方案看起来很脏,但如果你的要求是“FormBorderStyle.None”选项,那可能是你最好的选择。
【解决方案4】:

这里实际上有两个完全不同的问题在起作用。诚然,从功能的角度来看,它们看起来基本相同,但从实现模型的角度来看(正如 Windows 本身自然会使用的那样),它们是不相关的。

正如其他人回答的那样,您可以通过将其MaximizeBox 属性设置为false 来防止您的表单最大化。这将删除窗体底层窗口上的WS_MAXIMIZEBOX style,这会阻止窗口管理器允许窗口最大化。它禁用窗口标题栏上的最大化框(最小化框和关闭框之间的那个),禁用窗口/系统菜单上的“最大化”选项,以及我可能忘记的任何其他最大化窗口的方法。

但是,这与 Win+ 键盘快捷键无关,它调用 Aero Snap 就像将窗口拖动到神奇位置 sat屏幕的边缘。窗口管理器,无论是由于错误还是 Aero Snap 的功能,仍然允许您有效地“最大化”不应最大化的窗口。设置MaximizeBox 属性不会影响这一点,因此如果您确实想阻止用户以这种方式更改窗口大小,则需要禁用 Aero Snap 对窗口的影响。

不幸的是,没有任何方法(至少据我所知)以编程方式在每个窗口或每个进程的基础上禁用 Aero Snap(另请参阅 this related question)。如果用户启用了 Aero Snap,您可以假设他们希望该行为和应用程序不应该篡改它。您唯一能做的就是完全禁用调整窗口大小。在 WinForms 中,您可以通过将 FormBorderStyle 属性设置为以下之一来实现:FormBorderStyle.FixedSingleFormBorderStyle.Fixed3DFormBorderStyle.FixedDialog。如果您仍然希望以其他方式调整窗口大小,则需要编写代码来手动处理,这不是一件特别容易的事。

因此,我鼓励您仔细考虑这是否真的有必要。所有其他不可最大化的窗口只需通过设置 MaximizeBox 属性(或在其 UI 框架中执行等效操作)即可完成此操作,这意味着它们仍然可以通过 Aero Snap 有效地最大化。如果这适用于其他所有人的窗口,包括那些属于 Windows 本身的窗口,那么它可能对您也适用。

【讨论】:

  • 我在寻找类似的答案时遇到了这个问题,并将 MaximizeBox 设置为 false 似乎可以防止任何最大化路径。我猜这在现在和发布这个答案之间已经修复了。还是我错过了什么?
【解决方案5】:

将MaximumSize 设置为等于Size(或某个大小)至少会阻止窗口进入全屏状态。它仍然捕捉到左上角,但至少它仍然是一个窗口并且看起来正确 - 就像它是 Windows 愚蠢而不是你的程序。

【讨论】:

  • 您可能还需要设置最小尺寸。对我来说,如果 Min 和 Max 不相等,Win+Up 仍然会弄乱大小。我做了一个 LockSize()UnlockSize() 来调整大小。 Lock() 将 Min 和 Max 设置为当前大小,Unlock() 将 Min 设置为 真正的最小值,而 Max 获取放入任意大数。
【解决方案6】:

您可以通过设置防止窗口对齐到左上角:

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

在表单的移动事件中。

【讨论】:

    【解决方案7】:

    如果您的窗口或应用程序已激活,您可以尝试 RegisterHotKey Win+Up,如果已停用,请取消注册此热键。您必须捕获热键并返回适当的值以防止进一步处理。

    查看WM_ACTIVATEAPPWM_ACTIVATEWM_NCACTIVATE。如果您想为所有窗口禁用 Win+UP,则可以使用第一个。

    【讨论】:

      【解决方案8】:

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

      【讨论】:

        【解决方案9】:

        设置formborderstyle为fixedsing

        Maximizebox=false
        

        设置maximumsize为winform默认大小的大小

        例如:如果 size(646,385) 则设置 maximumsize(646,385)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-10-31
          相关资源
          最近更新 更多