Come rilevare quando un modulo di Windows viene ridotto a icona?


86

So che posso ottenere lo stato corrente da WindowState, ma voglio sapere se c'è qualche evento che si attiva quando l'utente cerca di ridurre a icona il modulo.

Risposte:


122

È possibile utilizzare l'evento Resize e controllare la proprietà Forms.WindowState nell'evento.

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

2
Si noti che questo sembra essere uno di quei posti in cui le eccezioni possono essere inghiottite .
Jonathon Reinhart

1
Hai anche bisogno di this.Resize + = new System.EventHandler (this.Form1_Resize);
Tom

80

Per entrare prima che il modulo sia stato ridotto a icona, dovrai collegarti alla procedura 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);
    }

Per reagire dopo che il modulo è stato minimizzato agganciarsi Resizeall'evento come sottolineano le altre risposte (incluso qui per completezza):

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

0xF030 è quando si ingrandisce dallo stato normale della finestra. 0xF120 è quando si ingrandisce dalla barra delle finestre
k4yaman

In realtà, questo cattura solo l' evento Minimizza clic ! Quello che stai cercando è WM_SIZE (0x0005) e SIZE_MINIMIZED (1)
Ori Nachum

17

Non conosco un evento specifico , ma l' Resizeevento si attiva quando il modulo è ridotto a icona, puoi controllare FormWindowState.Minimizedin quell'evento


2
Questo combinato con un flag "lastState" privato è il modo più semplice per farlo.
Matthew Scharley,

7

Per le persone che cercano eventi di minimizzazione delle finestre WPF:

È un po 'diverso. Per il callback utilizzare WindowState:

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

L'evento da utilizzare è StateChanged (invece Resize):

public Main()
{
    InitializeComponent();
    this.StateChanged += Form1_Resize;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.