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

Ste*_*bob 10 .net windows keyboard-shortcuts winforms

我在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
Run Code Online (Sandbox Code Playgroud)

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

编辑:

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

编辑:

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

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

SLa*_*aks 9

使用Spy ++检查应用程序在按下Window + M时收到哪些Windows消息,然后在表单中检查该消息WndProc并最小化表单.

Windows + M似乎发送了一个WM_SIZE设置为wParam 的消息SIZE_MINIMIZED.