¿Cómo detectar cuando se minimiza un formulario de Windows?


84

Sé que puedo obtener el estado actual mediante WindowState, pero quiero saber si hay algún evento que se active cuando el usuario intente minimizar el formulario.

Respuestas:


122

Puede usar el evento Resize y verificar la propiedad Forms.WindowState en el evento.

private void Form1_Resize ( object sender , EventArgs e )
{
    if ( WindowState == FormWindowState.Minimized )
    {
        // Do some stuff
    }
}

2
Tenga en cuenta que este parece ser uno de esos lugares donde se pueden tragar las excepciones .
Jonathon Reinhart

1
También necesita this.Resize + = new System.EventHandler (this.Form1_Resize);
Tom

79

Para ingresar antes de que el formulario se haya minimizado, deberá conectarse al procedimiento WndProc:

    private const int WM_SYSCOMMAND = 0x0112;
    private const int SC_MINIMIZE = 0xF020; 

    [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
    protected override void WndProc(ref Message m)
    {
        switch(m.Msg)
        {
            case WM_SYSCOMMAND:
                int command = m.WParam.ToInt32() & 0xfff0;
                if (command == SC_MINIMIZE)
                {
                    // Do your action
                }
                // If you don't want to do the default action then break
                break;
        }
        base.WndProc(ref m);
    }

Para reaccionar después de que el formulario se haya minimizado, ingrese al Resizeevento como señalan las otras respuestas (incluidas aquí para completar):

private void Form1_Resize (object sender, EventArgs e)
{
    if (WindowState == FormWindowState.Minimized)
    {
        // Do your action
    }
}

0xF030 es cuando se maximiza desde el estado normal de la ventana. 0xF120 es cuando se maximiza desde la barra de Windows
k4yaman

En realidad, ¡esto solo detecta el evento Minimize Click ! Lo que estás buscando es WM_SIZE (0x0005) & SIZE_MINIMIZED (1)
Ori Nachum

17

No sé de un evento específico , pero el Resizeevento se activa cuando se minimiza el formulario, puede verificar FormWindowState.Minimizeden ese evento


2
Esto, combinado con una bandera privada "lastState", es la forma más fácil de hacerlo.
Matthew Scharley

7

Para las personas que buscan eventos de minimización de ventanas de WPF:

Es un poco diferente. Para la devolución de llamada, use WindowState:

private void Form1_Resize(object sender, EventArgs e)
{
    if (WindowState == FormWindowState.Minimized)
    {
        // Do some stuff
    }
}

El evento a usar es StateChanged (en lugar de Resize):

public Main()
{
    InitializeComponent();
    this.StateChanged += Form1_Resize;
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.