Jak wykryć, że formularz systemu Windows jest minimalizowany?

84

Wiem, że mogę uzyskać bieżący stan przez WindowState, ale chcę wiedzieć, czy jest jakieś zdarzenie, które zostanie uruchomione, gdy użytkownik spróbuje zminimalizować formularz.

Jorge Branco
źródło

Odpowiedzi:

122

Możesz użyć zdarzenia Resize i sprawdzić właściwość Forms.WindowState w zdarzeniu.

private void Form1_Resize ( object sender , EventArgs e )
{
    if ( WindowState == FormWindowState.Minimized )
    {
        // Do some stuff
    }
}
Steve Dignan
źródło
2
Zwróć uwagę, że wydaje się, że jest to jedno z tych miejsc, w których wyjątki można połknąć .
Jonathon Reinhart
1
Potrzebujesz również this.Resize + = new System.EventHandler (this.Form1_Resize);
Tom
79

Aby wejść przed zminimalizowaniem formularza, musisz podłączyć się do procedury 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);
    }

Aby zareagować po zminimalizowaniu formularza, dołącz do Resizezdarzenia, jak wskazują inne odpowiedzi (uwzględnione tutaj dla kompletności):

private void Form1_Resize (object sender, EventArgs e)
{
    if (WindowState == FormWindowState.Minimized)
    {
        // Do your action
    }
}
ChrisF
źródło
0xF030 występuje podczas maksymalizacji ze stanu normalnego okna. 0xF120 występuje podczas maksymalizacji z paska systemu Windows
k4yaman
Właściwie to tylko łapie zdarzenie Minimize Click ! To, czego szukasz, to WM_SIZE (0x0005) i SIZE_MINIMIZED (1)
Ori Nachum,
17

Nie wiem o konkretnym zdarzeniu, ale Resizezdarzenie jest uruchamiane, gdy formularz jest zminimalizowany, możesz sprawdzić FormWindowState.Minimizedw tym zdarzeniu

Dan F
źródło
2
To w połączeniu z prywatną flagą „lastState” jest najłatwiejszym sposobem na zrobienie tego.
Matthew Scharley
7

Dla osób, które szukają zdarzenia minimalizacji okien WPF:

Jest trochę inaczej. Do wywołania zwrotnego użyj WindowState:

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

Zdarzeniem do użycia jest StateChanged (zamiast Resize):

public Main()
{
    InitializeComponent();
    this.StateChanged += Form1_Resize;
}
Chaos
źródło