.net 如何使用Windows最小化我的应用程序+;m键盘快捷键?
我在VB.NET2008中有一个简单的winforms应用程序。我使用的表单具有完全自定义的外观,因此没有标题栏,因此没有最小化、最大化和关闭按钮。我创建了自定义控件来替换这些控件 如果我运行我的应用程序,并单击“显示桌面”快捷方式,所有程序都会正确最小化,包括我的程序。但是,如果我使用Windows+M快捷方式,除我的程序外,所有程序都会最小化。似乎表单上缺少内置的最小化按钮导致我的应用程序忽略了Windows+M 如何检测Windows+M,尤其是在我的应用程序未激活的情况下,或者如何复制内置最小化按钮的功能 编辑: 我尝试过实现以下代码,但没有成功.net 如何使用Windows最小化我的应用程序+;m键盘快捷键?,.net,windows,winforms,keyboard-shortcuts,.net,Windows,Winforms,Keyboard Shortcuts,我在VB.NET2008中有一个简单的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\u SIZE
消息。坐在我旁边的开发人员在QT中使用C++,并且显示了完全相同的行为:当Windows + M被按下时,没有窗体/窗口边框=没有消息最小化。
Windows+D确实可以将所有内容最小化,但我相信这是“显示桌面”按钮的复制品
我的结论是,如果表单没有边框,Windows甚至不会生成消息,因此无法拦截它。我注意到Windows Media Player也表现出同样的行为。当应用程序处于蒙皮模式时,Windows+M不会将其最小化。使用Spy++检查应用程序在按下Windows+M时收到的Windows消息,然后在表单的
WndProc
中检查该消息并最小化表单
Windows+M发送的消息中wParam设置为SIZE\u MINIMIZED
请检查此论坛。解决方案是覆盖表单的CreateParams方法。我面临同样的问题。
我找到的解决方案是在最小化应用程序时隐藏它。因此,当窗口打开时,图标在任务栏中可见,但当应用程序最小化时,图标不可见。代表互联网-感谢您在程序中关注这一点。您是否检查了Spy++中发生的情况?请处理NC(边界)区域的所有者绘制,以使其看起来符合您的需要,而不是无边界表单,但仍然作为一个完整的窗口。@SLaks,感谢您提供此信息。我已经尝试过实现,但还没有成功,(代码包含在我的编辑中)。还有什么进一步的建议吗?那个论坛帖子解决了一个完全不同的问题。任务栏切换从来都不是问题。