Как свести к минимуму мое приложение с помощью сочетания клавиш Windows + m?

У меня есть простое приложение winforms в VB.NET 2008. Я использую форму с полностью обычным внешним видом, поэтому нет строки заголовка, таким образом, кнопки минимизации, максимизации и закрытия. Я создал пользовательские элементы управления, чтобы заменить их.

Если у меня есть приложение, и я нажимаю ярлык "Показывать рабочий стол", все программы сведены к минимуму, включая мои. Но, если я использую ярлык Windows + M, все программы EXCEPT mine минимизируют. Похоже, что отсутствие встроенной кнопки минимизации в форме заставляет мое приложение игнорировать Windows + M.

Как определить Windows + M, особенно если мое приложение неактивно, или как я могу дублировать функциональные возможности встроенной кнопки "Свернуть"?

EDIT:

Я пробовал реализовать следующий код без успеха.

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. Или, скорее, я не перехватываю их должным образом.

EDIT:

Я проверил сообщения, которые получает мое приложение со Spy ++ (спасибо снова SLaks), и похоже, что сообщение WM_SIZE не отправлено в мое приложение. Я попробовал обычное приложение winforms со стандартной строкой заголовка и кнопками и получает сообщение WM_SIZE, как ожидалось, когда нажата кнопка Windows + M. Как-то отсутствие заголовка препятствует тому, чтобы сообщение WM_SIZE получалось в моей пользовательской форме WndProc.

EDIT:

Чем больше я вникаю в это, тем больше я думаю, что это может быть не так. Я подтвердил, что если форма не имеет границы, то не получено сообщение WM_SIZE. Разработчик, сидящий рядом со мной, использует С++ в Qt, и проявляется то же самое поведение: No form/window border = no message для минимизации при нажатии Windows + M. Windows + D работает, чтобы свести к минимуму все, но я считаю, что это дубликат кнопки "Показать рабочий стол".

Я прихожу к выводу, что если форма не имеет границы, Windows даже не генерирует сообщение, поэтому невозможно ее перехватить. Я заметил, что Windows Media Player демонстрирует такое же поведение. Когда он находится в режиме скина, Windows + M не минимизирует его.

Ответ 1

Используйте Spy ++, чтобы проверить, какие сообщения Windows получают ваше приложение при нажатии Window + M, затем проверьте это сообщение в форме WndProc и уменьшите форму.

Похоже, что Windows + M отправляет сообщение WM_SIZE с настройкой wParam на SIZE_MINIMIZED.

Ответ 3

У меня такая же проблема. Решение, которое я нашел, заключается в том, чтобы скрыть приложение, когда оно сведено к минимуму. Таким образом, значок отображается на панели задач, когда окно открыто, но не отображается, когда приложение сведено к минимуму.