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