visual ventana una salir programar para formulario form evento deshabilitar codigo cerrar boton aplicacion c# winforms

ventana - formclosing c#



Anular el botón Cerrar estándar(X) en Windows Form (11)

¿Cómo hago para cambiar lo que sucede cuando un usuario hace clic en el botón Cerrar (X roja) en una aplicación de Windows Forms (en C #)?


  1. Simplemente vaya a "Program.Designer.cs"
  2. Descubre la función llamada protected override void Dispose(bool disposing)
  3. Comente o elimine la línea base. base.Dispose(disposing);
  4. En lugar de esa línea, escribe el código para tu operación cercana


Esta es una pregunta muy común. Una buena respuesta está aquí:

VB.NET sobrecarga la funcionalidad predeterminada cuando el usuario hace clic en la X (Cerrar Programa)

Si no se siente cómodo poniendo su código en el evento Form_Closing, la única otra opción que conozco es un "truco" que he usado una o dos veces. No debería ser necesario recurrir a este truco, pero aquí está:

No use el botón de cierre normal. En cambio, crea tu formulario para que no tenga ControlBox. Puede hacer esto configurando ControlBox = false en el formulario, en cuyo caso, aún tendrá la barra normal en la parte superior del formulario, o puede establecer FormBorderStyle del formulario en "Ninguno. Si realiza esta segunda ruta, allí no habrá barras en la parte superior ni en ningún otro borde visible, por lo que deberá simularlas dibujando en el formulario o mediante el uso artístico de los controles del Panel.

Luego puede agregar un botón estándar y hacer que se vea como un botón de cierre, y poner su código de limpieza allí. Al final del evento del botón, simplemente llame a this.Close() (C #) o Me.Close() (VB)


La respuesta aceptada funciona bastante bien. Un método alternativo que he usado es crear un método FormClosing para el Formulario principal. Esto es muy similar a la anulación. Mi ejemplo es para una aplicación que se minimiza en la bandeja del sistema al hacer clic en el botón de cerrar en el formulario.

private void Form1_FormClosing(object sender, FormClosingEventArgs e) { if (e.CloseReason == CloseReason.ApplicationExitCall) { return; } else { e.Cancel = true; WindowState = FormWindowState.Minimized; } }

Esto permitirá ALT + F4 o cualquier cosa en la aplicación que llama a Application.Exit (); actuar de forma normal mientras se hace clic en (X) minimizará la Aplicación.


O anula el OnFormClosing o se registra para el evento FormClosing .

Este es un ejemplo de anulación de la función OnFormClosing en la forma derivada:

protected override void OnFormClosing(FormClosingEventArgs e) { e.Cancel = true; }

Este es un ejemplo del controlador del evento para detener el cierre del formulario que puede estar en cualquier clase:

private void FormClosing(object sender,FormClosingEventArgs e) { e.Cancel = true; }

Para obtener más avanzado, verifique la propiedad CloseReason en FormClosingEventArgs para asegurarse de que se realice la acción apropiada. Es posible que desee realizar solo la acción alternativa si el usuario intenta cerrar el formulario.


Puede anular OnFormClosing para hacer esto. Solo tenga cuidado de no hacer nada demasiado inesperado, ya que hacer clic en la ''X'' para cerrar es un comportamiento bien entendido.

protected override void OnFormClosing(FormClosingEventArgs e) { base.OnFormClosing(e); if (e.CloseReason == CloseReason.WindowsShutDown) return; // Confirm user wants to close switch (MessageBox.Show(this, "Are you sure you want to close?", "Closing", MessageBoxButtons.YesNo)) { case DialogResult.No: e.Cancel = true; break; default: break; } }


Una cosa que estas respuestas carecen, y que los novatos probablemente estén buscando, es que si bien es bueno tener un evento:

private void Form1_FormClosing(object sender, FormClosingEventArgs e) { // do something }

No va a hacer nada a menos que registre el evento. Pon esto en el constructor de la clase:

this.FormClosing += Form1_FormClosing;


Una situación en la que es bastante útil poder manejar el evento de clic de botón x es cuando está usando un Formulario que es un contenedor MDI. La razón es que los eventos cerrados y cerrados se plantean primero con los niños y, por último, con los padres. Entonces, en un escenario, un usuario hace clic en el botón x para cerrar la aplicación y el padre MDI solicita una confirmación para continuar. En caso de que decida no cerrar la aplicación, pero continúe con lo que sea que esté haciendo, los niños ya habrán procesado el evento de cierre que posiblemente haya perdido información / trabajo. Una solución es interceptar el mensaje WM_CLOSE del bucle de mensajes de Windows en su formulario de solicitud principal (es decir, que cerró, finaliza la aplicación) así:

protected override void WndProc(ref Message m) { if (m.Msg == 0x0010) // WM_CLOSE { // If we don''t want to close this window if (ShowConfirmation("Are you sure?") != DialogResult.Yes) return; } base.WndProc(ref m); }


como dijo Jon B, pero también querrá comprobar ApplicationExitCall y TaskManagerClosing CloseReason:

protected override void OnFormClosing(FormClosingEventArgs e) { if ( e.CloseReason == CloseReason.WindowsShutDown ||e.CloseReason == CloseReason.ApplicationExitCall ||e.CloseReason == CloseReason.TaskManagerClosing) { return; } e.Cancel = true; //assuming you want the close-button to only hide the form, //and are overriding the form''s OnFormClosing method: this.Hide(); }



protected override bool ProcessCmdKey(ref Message msg, Keys dataKey) { if (dataKey == Keys.Escape) { this.Close(); //this.Visible = false; //Plus clear values from form, if Visible false. } return base.ProcessCmdKey(ref msg, dataKey); }