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.

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
    }
}

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
    }
}

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


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;
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.