2010-02-17 14 views
10

Tengo una aplicación winforms simple en VB.NET 2008. Estoy usando un formulario con un aspecto completamente personalizado, por lo que no hay una barra de título, por lo tanto, no minimizar, maximizar y cerrar botones. Creé controles personalizados para reemplazarlos.¿Cómo puedo minimizar mi aplicación con el atajo de teclado de Windows + m?

Si tengo mi aplicación en ejecución y hago clic en el acceso directo 'Mostrar escritorio', todos los programas se minimizan correctamente, incluido el mío. Pero, si utilizo el atajo Windows + M, todos los programas EXCEPTO el mío se minimizan. Parece que la falta del botón de minimizar integrado en el formulario hace que mi aplicación ignore Windows + M.

¿Cómo puedo detectar de Windows + M, especialmente si mi aplicación no está activa, o cómo puedo duplicar la funcionalidad de la incorporada en el botón de minimizar?

EDIT:

he intentado implementar el código siguiente, sin éxito.

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 

Este parece ser el enfoque correcto (gracias a SLaks), pero no parece mi aplicación para ser recibir cualquier mensaje de de Windows + M. O, más probablemente, no los interceptaré correctamente.

EDIT:

He comprobado los mensajes que mi aplicación está recibiendo con Spy ++ (gracias de nuevo SLaks) y parece que el mensaje es WM_SIZEno siendo enviados a mi aplicación. Probé una aplicación winforms regular con la barra de título estándar y botones, y recibe el mensaje WM_SIZE como se esperaba cuando se presiona Windows + M. De alguna manera, la falta de una barra de título impide que el mensaje WM_SIZE se reciba en el WndProc de mi formulario personalizado.

EDIT:

Cuanto más cavar en esto, más que creo que puede que no haya una forma de evitar este comportamiento. Confirmé que si el formulario no tiene un borde, no se recibe el mensaje WM_SIZE. El desarrollador que está sentado junto a mí usa C++ en Qt y se exhibe el mismo comportamiento: sin borde de formulario/ventana = no hay mensaje para minimizar cuando se presiona Windows + M. Windows + D funciona para minimizar todo, pero creo que es un duplicado del botón Mostrar escritorio.

Llego a la conclusión de que si un formulario no tiene ningún borde, Windows ni siquiera genera un mensaje, por lo que no hay forma de interceptarlo. Me di cuenta de que Windows Media Player exhibe este mismo comportamiento. Cuando está en modo skin, Windows + M no lo minimiza.

+10

En nombre de Internet, gracias por preocuparse por esto en su programa. –

+0

¿Comprobaste lo que sucede en Spy ++? – SLaks

+1

En lugar de una forma sin bordes, maneje la pintura del propietario del área NC (borde) para que se vea como desea, pero aún así actuar como una ventana completa. –

Respuesta

9

Uso Spy ++ para comprobar qué mensajes de Windows su aplicación recibe cuando se pulsa Ventana + M, a continuación, comprobar para ese mensaje en WndProc de su forma y la forma minimze.

Parece que Windows + M envía un mensaje WM_SIZE con wParam establecido en SIZE_MINIMIZED.

+0

@SLaks, gracias por esta información. Intenté implementarlo, sin suerte aún (código incluido en mi edición). ¿Alguna otra sugerencia? – Stewbob

0

Me encuentro con el mismo problema. La solución que encontré, es ocultar la aplicación cuando está minimizada. Entonces, el ícono es visible en la barra de tareas cuando la ventana está abierta, pero no visible cuando la aplicación se minimiza.

Cuestiones relacionadas