Wie kann man erkennen, wann ein Windows-Formular minimiert wird?

83

Ich weiß, dass ich den aktuellen Status von WindowState abrufen kann, aber ich möchte wissen, ob ein Ereignis ausgelöst wird, wenn der Benutzer versucht, das Formular zu minimieren.

Jorge Branco
quelle

Antworten:

121

Sie können das Ereignis "Größe ändern" verwenden und die Forms.WindowState-Eigenschaft im Ereignis überprüfen.

private void Form1_Resize ( object sender , EventArgs e )
{
    if ( WindowState == FormWindowState.Minimized )
    {
        // Do some stuff
    }
}
Steve Dignan
quelle
2
Beachten Sie, dass dies einer der Orte zu sein scheint, an denen Ausnahmen verschluckt werden können .
Jonathon Reinhart
1
Sie benötigen außerdem this.Resize + = neuer System.EventHandler (this.Form1_Resize);
Tom
78

Um einzusteigen, bevor das Formular minimiert wurde, müssen Sie sich in die WndProc-Prozedur einbinden:

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

Um zu reagieren, nachdem das Formular minimiert wurde, haken Sie sich in das ResizeEreignis ein, wie in den anderen Antworten angegeben (der Vollständigkeit halber hier enthalten):

private void Form1_Resize (object sender, EventArgs e)
{
    if (WindowState == FormWindowState.Minimized)
    {
        // Do your action
    }
}
ChrisF
quelle
0xF030 ist beim Maximieren aus dem normalen Fensterzustand. 0xF120 ist beim Maximieren von der Fensterleiste
k4yaman
Tatsächlich fängt dies nur das Minimize Click- Ereignis ab! Was Sie suchen, ist WM_SIZE (0x0005) & SIZE_MINIMIZED (1)
Ori Nachum
17

Ich kenne kein bestimmtes Ereignis, aber das ResizeEreignis wird ausgelöst, wenn das Formular minimiert ist. Sie können dies FormWindowState.Minimizedin diesem Ereignis überprüfen

Dan F.
quelle
2
Dies ist in Kombination mit einem privaten "lastState" -Flag der einfachste Weg, dies zu tun.
Matthew Scharley
8

Für Personen, die nach WPF-Fenstern suchen, um Ereignisse zu minimieren:

Es ist ein bisschen anders. Verwenden Sie für den Rückruf WindowState:

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

Das zu verwendende Ereignis ist StateChanged (statt Resize):

public Main()
{
    InitializeComponent();
    this.StateChanged += Form1_Resize;
}
Chaos
quelle