Как свернуть приложение с помощью сочетания клавиш Windows + m? - PullRequest
10 голосов
/ 17 февраля 2010

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

Если у меня запущено приложение и я нажимаю ярлык «Показать рабочий стол», все программы корректно свернуты, включая мою. Но, если я использую ярлык Windows + M , все программы за исключением моей минимизируются. Кажется, что отсутствие встроенной кнопки минимизации в форме заставляет мое приложение игнорировать 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 не принимается. Сидящий рядом со мной разработчик использует C ++ в Qt, и демонстрируется точно такое же поведение: нет границы формы / окна = нет сообщения, которое можно свернуть при нажатии Windows + M . Windows + D работает, чтобы свернуть все, но я считаю, что это дубликат кнопки Показать рабочий стол.

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

Ответы [ 3 ]

9 голосов
/ 17 февраля 2010

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

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

0 голосов
/ 04 декабря 2010

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

0 голосов
/ 05 марта 2010

Проверьте этот форум http://www.windows -tech.info / 3 / e4b66d1b1b690888.php решение состоит в переопределении метода CreateParams формы.

...