如何使用Windows + m键盘快捷键最小化我的应用程序?

时间:2010-02-17 20:18:21

标签: .net windows winforms keyboard-shortcuts

我在VB.NET 2008中有一个简单的winforms应用程序。我使用的是具有完全自定义外观的表单,因此没有标题栏,因此没有最小化,最大化和关闭按钮。我已经创建了自定义控件来替换它们。

如果我的应用程序正在运行,并且我单击“显示桌面”快捷方式,则所有程序都会正确地最小化,包括我的。但是,如果我使用 Windows + M 快捷方式,除了我的所有程序最小化。似乎缺少表单上的内置最小化按钮会导致我的应用忽略 Windows + M

如何检测 Windows + M ,特别是如果我的应用程序未处于活动状态,或者如何复制内置最小化按钮的功能?

修改

我尝试过实现以下代码,但没有成功。

Const WM_SIZE As Integer = &H5
Const SIZE_MINIMIZED As Integer = &H1

Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
  MyBase.WndProc(m)

  If m.Msg = WM_SIZE Then
     If m.WParam = SIZE_MINIMIZED Then
        //Minimize the form.
        Me.WindowState = FormWindowState.Minimized
     End If

  End If
End Sub

这似乎是正确的方法(感谢SLaks),但我的应用程序似乎没有收到来自 Windows + M 的任何消息。或者,更有可能的是,我没有正确拦截它们。

修改

我已经查看了我的应用通过Spy ++收到的消息(再次感谢SLaks),看起来WM_SIZE消息被发送到我的应用。我尝试了一个带有标准标题栏和按钮的常规winforms应用程序,当按下 Windows + M 时,它会按预期收到WM_SIZE消息。不知何故,缺少标题栏会阻止在我的自定义表单的WndProc中收到WM_SIZE消息。

修改

我越深入研究这个问题,我认为可能无法绕过这种行为。我已经确认,如果表单没有边框,则不会收到WM_SIZE消息。坐在我旁边的开发人员在Qt中使用C ++,并且表现出完全相同的行为:没有窗体/窗口边框=当按下 Windows + M 时没有消息要最小化。 Windows + D 确实可以最大限度地减少一切,但我相信这是Show Desktop按钮的重复。

我得出的结论是,如果表单没有边框,Windows甚至不会生成消息,因此无法拦截它。我注意到Windows Media Player表现出同样的行为。当它处于蒙皮模式时, Windows + M 不会将其最小化。

3 个答案:

答案 0 :(得分:9)

使用Spy ++检查应用程序在按下Window + M时收到的Windows消息,然后在表单的WndProc中检查该消息,并将表单缩小。

Windows + M似乎发送WM_SIZE消息,其中wParam设置为SIZE_MINIMIZED

答案 1 :(得分:0)

检查此论坛http://www.windows-tech.info/3/e4b66d1b1b690888.php解决方案是覆盖表单的CreateParams方法。

答案 2 :(得分:0)

我面临同样的问题。 我发现的解决方案是在应用程序最小化时隐藏它。因此,当窗口打开时,图标在任务栏中可见,但在应用程序最小化时不可见。