Подтвердить что ты не робот

Событие, когда окно максимизируется/не максимизируется

Есть ли событие, которое запускается при максимизации формы или ее максимизации?

Перед тем, как вы скажете Resize или SizeChanged: те получают только выстрел, если Size действительно изменяется. Если ваше окно окажется равным по размеру максимальному окну, они не срабатывают. Расположение выглядит следующим лучшим, но это снова похоже на азартные игры по совпадению.

4b9b3361

Ответ 1

Вы можете сделать это, переопределив WndProc:

protected override void WndProc( ref Message m )
{
    if( m.Msg == 0x0112 ) // WM_SYSCOMMAND
    {
        // Check your window state here
        if (m.WParam == new IntPtr( 0xF030 ) ) // Maximize event - SC_MAXIMIZE from Winuser.h
        {
              // THe window is being maximized
        }
    }
    base.WndProc(ref m);
}

Это должно обрабатывать событие в любом окне. SC_RESTORE - 0xF120, а SC_MINIMIZE - 0XF020, если вам нужны эти константы.

Ответ 2

Предположим, что никто не упомянул встроенный метод .NET.

Таким образом, вам не нужно переопределять обработчик обработки оконных сообщений.

Он даже захватывает события максимизации/восстановления, вызванные двойным щелчком по заголовку окна окна, который не имеет метода WndProc.

Скопируйте это и привяжите его к обработчику событий "Resize" в форме.

    FormWindowState LastWindowState = FormWindowState.Minimized;
    private void Form1_Resize(object sender, EventArgs e) {

        // When window state changes
        if (WindowState != LastWindowState) {
            LastWindowState = WindowState;


            if (WindowState == FormWindowState.Maximized) {

                // Maximized!
            }
            if (WindowState == FormWindowState.Normal) {

                // Restored!
            }
        }

    }

Ответ 3

Еще одно небольшое дополнение, чтобы проверить восстановление первоначального размера и положения после максимизации:

protected override void WndProc(ref Message m)
{
    base.WndProc(ref m);

    // WM_SYSCOMMAND
    if (m.Msg == 0x0112)
    {
        if (m.WParam == new IntPtr(0xF030) // Maximize event - SC_MAXIMIZE from Winuser.h
            || m.WParam == new IntPtr(0xF120)) // Restore event - SC_RESTORE from Winuser.h
        {
            UpdateYourUI();
        }
    }
}

Надеюсь на эту помощь.

Ответ 4

У меня была та же проблема, и я мог решить ее без переопределения. Поскольку у меня есть PictureBox в режиме док-станции "Заполнить", я мог бы использовать это событие SizeChanged, которое также срабатывало при максимизации окна.

Ответ 5

Если нет никакого очевидного события для прослушивания, вам, вероятно, придется подключиться к API Windows и поймать соответствующее сообщение (Google выясняет, что вы захотите перехватить сообщение WM_SYSCOMMAND: http://www.codeguru.com/forum/archive/index.php/t-234554.html).

Ответ 6

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

 private void MainForm_Resize(object sender, EventArgs e)
    {
        if (WindowState == FormWindowState.Maximized)
        {
            spContainer.SplitterDistance = 1000;
        }
        if (WindowState == FormWindowState.Normal)
            spContainer.SplitterDistance = 500;
    }

Ответ 7

Я надеюсь, что эта часть кода будет полезна.

            if (m.Msg == User32.WM_WINDOWPOSCHANGING && IsHandleCreated)
            {
                User32.WINDOWPLACEMENT wp = new User32.WINDOWPLACEMENT();
                wp.length = Marshal.SizeOf(typeof(User32.WINDOWPLACEMENT));
                User32.GetWindowPlacement(Handle, ref wp);

                switch (wp.showCmd)
                {
                    case User32.SW_RESTORE:
                    case User32.SW_NORMAL:
                    case User32.SW_SHOW:
                    case User32.SW_SHOWNA:
                    case User32.SW_SHOWNOACTIVATE:
                        _windState = FormWindowState.Normal;
                        if (wp.showCmd == User32.SW_RESTORE)
                            Update();
                        break;

                    case User32.SW_SHOWMAXIMIZED:
                        _windState = FormWindowState.Maximized;
                        SetMaximumSize();

                        break;

                    case User32.SW_SHOWMINIMIZED:
                    case User32.SW_MINIMIZE:
                    case User32.SW_SHOWMINNOACTIVE:
                        _windState = FormWindowState.Minimized;
                        break;
                }
            }

    private void SetMaximumSize()
    {
        Screen screen = Screen.FromControl(this);
        if (screen != null && !screen.WorkingArea.IsEmpty)
        {
            int sizeDiff = this.Size.Width - this.ClientSize.Width;
            var maxSize = new Size(screen.WorkingArea.Width + sizeDiff, screen.WorkingArea.Height + sizeDiff);
            this.MaximumSize = maxSize;
        }
    }

    #region Window State

    public const int SW_NORMAL = 1,
        SW_SHOWMINIMIZED = 2,
        SW_SHOWMAXIMIZED = 3,
        SW_SHOWNOACTIVATE = 4,
        SW_SHOW = 5,
        SW_MINIMIZE = 6,
        SW_SHOWMINNOACTIVE = 7,
        SW_SHOWNA = 8,
        SW_RESTORE = 9;

    #endregion Window State

Ответ 8

' Great tip. So if it helps to VisualBasic In Code
Private Const WM_SYSCOMMAND As Integer = &H112
Private Const SC_MAXIMIZE As Integer = &HF030
' # WndProcess 루프함수
Protected Overrides Sub WndProc(ByRef m As Message)
    If m.Msg.Equals(WM_SYSCOMMAND) Then
        If (m.WParam.ToInt32.Equals(SC_MAXIMIZE)) Then
            Me.p_FullScreen()
            Return
        End If
    End If

    MyBase.WndProc(m)
End Sub

Ответ 9

Я новичок здесь, поэтому комментарии не разрешены, но это комментарий к чистому ответу GeoTarget:

Первая строка OUGHT будет слегка изменена на nullable, чтобы поймать, если форма запущена. Минимизировано:

FormWindowState? LastWindowState = null;

И банальное предложение: переместите назначение LastWindowState после "if" s, чтобы пользователь мог легко проверить не только то, что вы делали, но и то, из чего он пришел:

FormWindowState? LastWindowState = null;
private void Form1_Resize(object sender, EventArgs e) {
    // When window state changes
    if (WindowState != LastWindowState) {
        if (WindowState == FormWindowState.Maximized) {
            // Maximized!
        }
        if (WindowState == FormWindowState.Normal) {
            // Restored!
        }
        LastWindowState = WindowState;
    }
}