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

10
我有一个简单的VB.NET 2008 winforms应用程序。我使用了一个完全自定义外观的表单,因此没有标题栏,也没有最小化、最大化和关闭按钮。我已创建了自定义控件来替换它们。
如果我的应用程序正在运行,并且我点击“显示桌面”快捷方式,所有程序都会适当地最小化,包括我的应用程序。但是,如果我使用Windows+M快捷键,则除了我的应用程序之外,所有程序都会最小化。似乎窗体上缺少内置的最小化按钮会导致我的应用程序忽略Windows+M
如何检测Windows+M,特别是如果我的应用程序不处于活动状态,或者如何复制内置Minimize按钮的功能?
编辑:
我尝试实现了以下代码,但没有成功。
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 + MWindows + D可以将所有内容最小化,但我认为这是“显示桌面”按钮的重复。
我得出结论,如果窗体没有边框,则Windows甚至不会生成消息,因此无法拦截它。我注意到Windows Media Player表现出同样的行为。当它处于皮肤模式下时,Windows + M无法将其最小化。

10
代表互联网,感谢您在您的计划中关注此事。 - Tom Ritter
你有没有检查Spy++中发生了什么? - SLaks
1
不要使用无边框窗体,而是处理所有者绘制NC(边框)区域,使其看起来符合您的要求,但仍然作为完整的窗口。 - John Arlen
3个回答

9
使用Spy++检查应用程序在按下Window+M时接收到的Windows消息,然后在窗体的WndProc中检查该消息并最小化窗体。
似乎Windows+M会发送一个带有wParam设置为SIZE_MINIMIZEDWM_SIZE消息。

@SLaks,感谢您提供的信息。我已经尝试实现了,但还没有成功(我的编辑中包含了代码)。您有什么进一步的建议吗? - Stewbob

0
我遇到了同样的问题。 我找到的解决方案是在最小化应用程序时隐藏它。因此,当窗口打开时,图标可见于任务栏,但在应用程序最小化时不可见。

0

那篇论坛帖子涉及完全不同的问题。任务栏切换从来没有成为一个问题。 - Stewbob

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