Evento cuando una ventana se maximiza / no maximiza

¿Hay un evento que se dispara cuando maximizas un formulario o lo desvalorizas?

Antes de decir Resize o Resize : solo se SizeChanged si el Size realmente cambia. Si su ventana tiene el mismo tamaño que la ventana maximizada, no se activan. La ubicación parece ser la siguiente mejor apuesta, pero una vez más se siente como una coincidencia.

Puede hacer esto anulando 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); } 

Esto debería manejar el evento en cualquier ventana. SC_RESTORE es 0xF120 , y SC_MINIMIZE es 0XF020 , si necesita esas constantes también.

Sorprende que nadie mencionó el método .NET incorporado.

De esta forma no es necesario anular el manejador de procesamiento de mensajes de Windows.

Incluso captura eventos de maximizar / restaurar causados ​​al hacer doble clic en la barra de título de la ventana, que no es el método WndProc.

Copie esto y vincule al controlador de eventos “Cambiar tamaño” en el formulario.

  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! } } } 

Otra pequeña adición para verificar la restauración de la dimensión original y la posición después de la maximización:

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

Espero que esto ayude.

Tuve el mismo problema, y ​​pude resolverlo sin anularlo. Debido a que tengo un PictureBox en el modo dock “Fill” podría usar su evento SizeChanged , que también se activó para maximizar la ventana.

Creo que el código es incluso más simple que eso. No necesita guardar el lastState porque WindowState está marcado en cualquier momento cuando se dispara el evento.

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

Si no hay un evento obvio para escuchar, probablemente deba conectar con la API de Windows y atrapar el mensaje apropiado (aparece que Google querrá interceptar el mensaje WM_SYSCOMMAND: http: //www.codeguru). com / forum / archive / index.php / t-234554.html ).

Espero que esta parte del código sea útil.

  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 
 ' 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 

Soy un novato aquí, así que no se permiten comentarios, pero este es un comentario a la respuesta limpia de GeoTarget :

La primera línea OUGHT debe cambiarse ligeramente a anulable, para detectar si el formulario se inicia. Minimizado:

 FormWindowState? LastWindowState = null; 

Y una sugerencia banal: mueva la asignación de LastWindowState a después del “si”, para que el usuario pueda verificar fácilmente no solo a qué va, sino también de qué proviene:

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