2010-02-17 72 views
10

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

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

如何检测的Windows + 中号,尤其是如果我的应用程序不活跃,或我怎么能复制内置的功能,最小化按钮?

编辑:

我试过执行下面的代码,但没有成功。

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 + 中号收到任何消息。或者,更可能的是,我没有正确拦截他们。

编辑:

我已经签出我的应用程序与间谍++(再次感谢SLaks)接收消息和它看起来像WM_SIZE消息越来越发送到我的应用程序。我试着用标准的标题栏和按钮尝试一个常规的winforms应用程序,并且它按照预期收到WM_SIZE消息Windows + M被按下。不知何故,缺少标题栏会阻止在自定义窗体的WndProc中收到WM_SIZE消息。

编辑:

我越挖成这样,我觉得有可能不是解决此问题的方式更多。我已确认,如果表单没有边框,则不会收到WM_SIZE消息。坐在我旁边的开发人员在Qt中使用C++,并且展示了完全相同的行为:没有窗体/窗口边框=没有消息以最小化Windows + M被按下。 Windows + D可以最大限度地减少所有事情,但我相信这是显示桌面按钮的重复。

我得出的结论是,如果窗体没有边框,Windows甚至不会生成消息,因此无法拦截它。我注意到Windows媒体播放器呈现出相同的行为。当它处于剥皮模式时,Windows + M不会使其最小化。

+10

代表互联网 - 感谢您在您的程序中关心此事。 – 2010-02-17 20:42:54

+0

你检查了间谍++中发生了什么? – SLaks 2010-02-17 20:50:08

+1

而不是无边界形式,处理NC(边界)区域的所有者绘画,使其看起来像你想要的方式,但仍然作为一个完整的窗口。 – 2014-03-06 22:28:08

回答

9

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

看来,Windows + M发送一个WM_SIZE消息与wParam设置为SIZE_MINIMIZED

+0

@SLaks,感谢您的信息。我尝试过实现,但没有运气,(代码包含在我的编辑中)。还有什么建议? – Stewbob 2010-02-17 20:45:48

0

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