2012-11-14 56 views
5

我想阻止我的桌面应用程序被最大化。它不应该成为任何手段最大化 - 通过双击标题栏,或者通过点击键盘上的Windows +向上键等

- >我禁用MaximizeBoxMinimizeBox两者。
- >我还设置了MAXIMUMSIZE的minimumSize我的WinForm

不过当我按下的Windows +向上箭头,我赢的形式转移到左上角的屏幕上,我的意思是它得到最大化。 所以请告诉我任何方式来防止这种情况发生......防止Winform被最大化?

+3

考虑为你的第二个问题创建另一个问题关于快捷方式 – emartel

+0

我也做了这个,我发现这一切都在谷歌。有些属性需要设置为false,有些则需要覆盖。 – Pavenhimself

回答

10

实际上这里有两个完全独立的问题。当然,从功能的角度看它们基本上是一样的,但是从实现模型的角度来看(就像Windows自然使用的那样),它们是无关的。

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

然而,这有什么好做的 + 键盘快捷键,这将调用Aero Snap一样会拖动窗口到魔法位置坐在屏幕的边缘。窗口管理器不管是作为Aero Snap的缺陷还是功能的结果,仍然允许您有效地“最大化”不应该最大化的窗口。设置MaximizeBox属性不会影响这一点,所以如果您真的想阻止用户通过这种方式更改窗口大小,您需要禁用Aero Snap对窗口的影响。

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

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

+1

我遇到了这个寻找类似的答案,并将MaximizeBox设置为false似乎阻止任何最大化路径。我猜这是现在和发布这个答案之间的问题。或者我错过了什么? – Karlovsky120

9

该窗体有一个名为MaximizeBox的属性 - 将其设置为false。

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

+1

MaximizeBox = false不会停止Windows +向上箭头的快捷方式来最大化任何窗口...如果我没有错,因为我面临同样的问题,在我的应用程序.... –

+0

您可以随时禁用Windows +向上快捷方式以及,然后专注于使其他每个键盘快捷键都可以使用。 – lifetimes

+0

应该正常工作,但事实并非如此。捣毁它的作品,https://stackoverflow.com/a/47994707/17034 –

1

有一个名为“MaximumBox”的Form类的属性,您必须在窗体的属性窗口中设置False ...这实际上将禁止以任何方式最大化窗体...此外,如果你想控制你的表格大小可以用这样的属性“的minimumSize,MAXIMUMSIZE”由您决定设置它们的值或创建的MaximumSizeChanged和MinimumSizeChanged事件的事件处理工作...

+0

这件事不是工作伙计.. 窗口正在转移到左上角,就像当你试图最大化一个16位的dos基础应用程序在您的32位Windows操作系统上... 它只是去左上角,然后否认任何运动,如当你最大化任何窗口... 我的意思是大小保持不变,但所有其他属性是相同的当任何正常的窗口是最大化.. 有没有办法解决这个问题...? –

3
this.FormBorderStyle = FormBorderStyle.FixedSingle; 

这行代码会阻止用户从重新调整窗口的大小。

除此之外,你隐藏/禁用最大化框,并应该做你所问。

要禁用最大化框使用此

this.MaximizeBox = false; 

要隐藏最大化框使用以及

this.MinimizeBox = false; 

如果最大化和最小化被设置为false的按钮消失。

+0

好友这将做,但m有FormBorderStyle = FormBorderStyle.None自定义窗体。有没有其他方法可以做到这一点... –

+0

您可以禁止'WINKEY + UP'组合以防止窗口最大化。除此之外,我会将最大/最小尺寸设置为固定值。这个解决方案看起来很肮脏,但如果你的要求是'FormBorderStyle.None'选项,那可能是你最好的选择。 –

1

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

2

您可以通过设置阻止Windows捕捉到左上角:

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

形式的移动事件。

1

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

请看WM_ACTIVATEAPP,WM_ACTIVATEWM_NCACTIVATE。如果您想禁用所有窗口的Win + UP,则可以使用第一种方法。