Як виявити, коли форма Windows зменшена?


84

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

Відповіді:


122

Ви можете використовувати подію Змінити розмір і перевірити властивість 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);
Том

79

Щоб увійти до того, як форма буде зведена до мінімуму, вам доведеться підключитися до процедури 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 - це розгортання з панелі вікон
k4yaman

Власне, це вловлює лише подію Мінімізувати клік ! Те, що ви шукаєте, це WM_SIZE (0x0005) & SIZE_MINIMIZED (1)
Орі Начум

17

Я не знаю конкретної події, але Resizeподія спрацьовує, коли форма згорнута, ви можете перевірити наявність FormWindowState.Minimizedцієї події


2
Це в поєднанні з приватним прапором "lastState" - найпростіший спосіб це зробити.
Метью Шарлі,

7

Для людей, які шукають мінімізуючу подію Windows WPF:

Це трохи інакше. Для зворотного виклику використовуйте WindowState:

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

Подією, яку слід використовувати, є StateChanged (замість цього змінити розмір):

public Main()
{
    InitializeComponent();
    this.StateChanged += Form1_Resize;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.