Как определить, когда форма окна сворачивается?


86

Я знаю, что могу получить текущее состояние с помощью WindowState, но я хочу знать, есть ли какое-либо событие, которое запускается, когда пользователь пытается свернуть форму.

Ответы:


122

Вы можете использовать событие Resize и проверить свойство Forms.WindowState в событии.

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

2
Обратите внимание, что это, похоже, одно из тех мест, где исключения можно проглотить .
Джонатон Рейнхарт

1
Вам также понадобится this.Resize + = new System.EventHandler (this.Form1_Resize);
Tom

80

Чтобы войти до того, как форма будет свернута, вам нужно подключиться к процедуре 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);
    }

Чтобы отреагировать после того, как форма была свернута, подключитесь к Resizeсобытию, как указывают другие ответы (включены здесь для полноты):

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

0xF030 - это при разворачивании из нормального состояния окна. 0xF120 - это при максимизации из панели Windows
k4yaman

Фактически, это только захватывает событие Minimize Click ! То, что вы ищете, - это WM_SIZE (0x0005) и SIZE_MINIMIZED (1)
Ори

17

Я не знаю конкретного события, но Resizeсобытие срабатывает, когда форма свернута, вы можете проверить FormWindowState.Minimizedэто событие


2
Это в сочетании с частным флагом lastState - самый простой способ решить эту проблему.
Мэтью Шарли,

7

Для людей, которые ищут событие сворачивания окон WPF:

Это немного другое. Для обратного вызова используйте WindowState:

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

Используемое событие - StateChanged (вместо Resize):

public Main()
{
    InitializeComponent();
    this.StateChanged += Form1_Resize;
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.