Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何使用Windows最小化我的应用程序+;m键盘快捷键?_.net_Windows_Winforms_Keyboard Shortcuts - Fatal编程技术网

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

.net 如何使用Windows最小化我的应用程序+;m键盘快捷键?,.net,windows,winforms,keyboard-shortcuts,.net,Windows,Winforms,Keyboard Shortcuts,我在VB.NET2008中有一个简单的winforms应用程序。我使用的表单具有完全自定义的外观,因此没有标题栏,因此没有最小化、最大化和关闭按钮。我创建了自定义控件来替换这些控件 如果我运行我的应用程序,并单击“显示桌面”快捷方式,所有程序都会正确最小化,包括我的程序。但是,如果我使用Windows+M快捷方式,除我的程序外,所有程序都会最小化。似乎表单上缺少内置的最小化按钮导致我的应用程序忽略了Windows+M 如何检测Windows+M,尤其是在我的应用程序未激活的情况下,或者如何复制内

我在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,感谢您提供此信息。我已经尝试过实现,但还没有成功,(代码包含在我的编辑中)。还有什么进一步的建议吗?那个论坛帖子解决了一个完全不同的问题。任务栏切换从来都不是问题。