Event when a window gets maximized/un-maximized

前端 未结 10 786
失恋的感觉
失恋的感觉 2020-11-27 05:48

Is there an event that is fired when you maximize a Form or un-maximize it?

Before you say Resize or SizeChanged: Those get only fired if t

相关标签:
10条回答
  • 2020-11-27 06:15

    A complete solution with maximize, minimize, restore and correct remove of the lower bits which are used for internal purposes only.

    protected override void WndProc(ref Message m)
    {
        const int WM_SYSCOMMAND = 0x0112;
        const int SC_MAXIMIZE = 0xF030;
        const int SC_MINIMIZE = 0xF020;
        const int SC_RESTORE = 0xF120;
    
        // dependig on the needs may be called before, after or even never (see below)
        // base.WndProc(ref m);
    
        if (m.Msg == WM_SYSCOMMAND)
        {
            /// <see cref="https://docs.microsoft.com/en-us/windows/win32/menurc/wm-syscommand"/>
            /// Quote:
            /// In WM_SYSCOMMAND messages, the four low - order bits of the wParam parameter 
            /// are used internally by the system.To obtain the correct result when testing 
            /// the value of wParam, an application must combine the value 0xFFF0 with the 
            /// wParam value by using the bitwise AND operator.
            int wParam = (m.WParam.ToInt32() & 0xFFF0);
    
            Debug.WriteLine($"Received param: { Convert.ToString(wParam, 16) } ");
    
            if (wParam == SC_MAXIMIZE)
            {
    
            }
    
            if (wParam == SC_MINIMIZE)
            {
    
            }
    
            if (wParam == SC_RESTORE)
            {
    
            }
        }
    
        // don't use when above call is uncommented
        base.WndProc(ref m);
    }
    
    0 讨论(0)
  • 2020-11-27 06:16

    Suprising that no one mentioned the inbuilt .NET method.

    This way you don't need to override the Window Message Processing handler.

    It even captures maximize/restore events caused by double-clicking the window titlebar, which the WndProc method does not.

    Copy this in and link it to the "Resize" event handler on the form.

        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!
                }
            }
    
        }
    
    0 讨论(0)
  • 2020-11-27 06:16

    Another little addition in order to check for the restore to the original dimension and position after the maximization:

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

    Hope this help.

    0 讨论(0)
  • 2020-11-27 06:17
    ' 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
    
    0 讨论(0)
  • 2020-11-27 06:25

    I believe the code is even simpler than that. You don't need to save the lastState because the WindowState is checked anytime when the event is fired.

     private void MainForm_Resize(object sender, EventArgs e)
        {
            if (WindowState == FormWindowState.Maximized)
            {
                spContainer.SplitterDistance = 1000;
            }
            if (WindowState == FormWindowState.Normal)
                spContainer.SplitterDistance = 500;
        }
    
    0 讨论(0)
  • 2020-11-27 06:27

    I'm a newbie here so comments not allowed, but this IS a comment to the clean answer by GeoTarget:

    The first line OUGHT to be slightly changed to nullable, to catch if the form is started Minimized:

    FormWindowState? LastWindowState = null;
    

    And a banal suggestion: Move the assignment of LastWindowState to after the "if"s, so the user can easily check not only what you go to, but also what it came from:

    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;
        }
    }
    
    0 讨论(0)
提交回复
热议问题