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.

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

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

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


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;
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.