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

标签 .net windows winforms keyboard-shortcuts

我在 VB.NET 2008 中有一个简单的 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_SIZE 消息。坐在我旁边的开发人员在 Qt 中使用 C++,并表现出完全相同的行为:没有窗体/窗口边框 = 按下 Windows + M 时没有要最小化的消息。 Windows + D 确实可以最小化所有内容,但我认为这是“显示桌面”按钮的副本。

我得出的结论是,如果窗体没有边框,Windows 甚至不会生成消息,因此无法拦截它。我注意到 Windows Media Player 表现出同样的行为。当它处于皮肤模式时,Windows + M 不会将其最小化。

最佳答案

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

Windows+M 似乎发送了一个 WM_SIZE wParam 设置为 SIZE_MINIMIZED 的消息。

关于.net - 如何使用 Windows+m 键盘快捷键最小化我的应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2284072/

相关文章:

.net - .NET 框架是否支持 EAX 加密模式?

.net - "Type not expected",使用 DataContractSerializer - 但它只是一个简单的类,没有什么有趣的东西?

c++ - 与自定义命名空间的链接失败未解析的外部符号

c# - 如何从工具提示中查找控件

c# - 如何使用反射调用带有 ref/out 参数的方法

r - 在 VSCode 中为 "Error: pandoc version 1.12.3 or higher is required",但在 R Studio 中有效

php - Windows 7 上的 Gettext 不翻译

C# - 无法设置 form.height

c# - 以编程方式选择 DataGridView 的一行

c# - 如何构建自己的自定义代码片段?