Event when a window gets maximized/un-maximized

前端 未结 10 787
失恋的感觉
失恋的感觉 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:29

    You can do this by overriding 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);
    }
    

    This should handle the event on any window. SC_RESTORE is 0xF120, and SC_MINIMIZE is 0XF020, if you need those constants, too.

    0 讨论(0)
  • 2020-11-27 06:30

    I hope this part of code will be useful.

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

    If there's no obvious event to listen for, you're probably going to need to hook into the Windows API and catch the appropriate message (Google turns up that you'll want to intercept the WM_SYSCOMMAND message: http://www.codeguru.com/forum/archive/index.php/t-234554.html).

    0 讨论(0)
  • 2020-11-27 06:32

    I had the same problem, and I could solve it without overriding. Because I have a PictureBox in dock mode "Fill" I could use it's SizeChanged event, which fired also on maximizing the window.

    0 讨论(0)
提交回复
热议问题