¿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#)?Invalidar botón Cerrar estándar (X) en Windows Forms
Respuesta
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;
}
}
Supongo que quiere minimizar a la bandeja, pero obtienes el +1 de mí por decir que ten cuidado. –
@Jon B: debe verificar el motivo cercano.Si Windows se está cerrando, no quiere mostrar cuadros de mensaje. –
Lo hice una declaración de cambio para no tener que desplazarme hacia la derecha para leer el lado derecho del '==' –
Anule el método OnFormClosing.
CUIDADO: Debe verificar CloseReason y solo modificar el comportamiento si se trata de UserClosing. No debe poner nada aquí que pueda paralizar la rutina de apagado de Windows.
Application Shutdown Changes in Windows Vista
Esto es de la Windows 7 logo program requirements.
¿Ofrecen una excepción si le pide al usuario que guarde el trabajo antes de apagarlo? – Adkins
Anular OnFormClosing?
Esta es una pregunta muy común. Una buena respuesta está aquí:
VB.NET overload default functionality when user clicks the X (Close Program)
Si usted no se siente cómodo poniendo su código en el evento Form_Closing, la única otra opción Soy consciente de que es un "hack" que he usado una o dos veces No debería ser necesario recurrir a este truco, pero aquí está:
No utilice 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á ninguna barra en la parte superior ni en ningún otro borde visible, por lo que tendrá que simularlos 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 mirada como un botón de cierre, y poner su código de limpieza en ese país. al final del evento de botón, simplemente llame this.Close()
(C#) o Me.Close()
(VB)
¿Por qué uno no se sentiría cómodo manejando el evento de cierre? En mi humilde opinión, agregar un botón Cerrar personalizado (pero convincente) no es tan trivial (especialmente cuando se toman en cuenta los efectos de transición y el material Aero, que normalmente se obtiene sin ningún problema). – Groo
En la respuesta a la que me he vinculado, la persona que hizo la pregunta no quería utilizar el evento Form_Closing por algún motivo. No estoy seguro de cuál era su razón, pero él no quería usarlo. Las veces que utilicé el truco, solo quería un botón de cerrar con un aspecto diferente. – David
En otras palabras, la otra respuesta estuvo ligada a (lo justo) y copiada, por lo que la mitad de la respuesta es irrelevante y el resto recomienda algo que no tiene ninguna justificación aquí. – jwg
De cualquier anulan la OnFormClosing o registrarse para el evento FormClosing.
Este es un ejemplo de anular la función OnFormClosing en forma derivada:
protected override void OnFormClosing(FormClosingEventArgs e)
{
e.Cancel = true;
}
Este es un ejemplo del controlador del evento de detener la forma de cierre que puede ser en cualquier clase:
private void FormClosing(object sender,FormClosingEventArgs e)
{
e.Cancel = true;
}
Para obtener más información, compruebe la propiedad CloseReason en FormClosingEventArgs para asegurarse de que se realiza la acción adecuada. Es posible que desee realizar solo la acción alternativa si el usuario intenta cerrar el formulario.
Una situación en la que es bastante útil poder manejar el evento de clic con el botón x es cuando está utilizando 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 consiste en interceptar el mensaje WM_CLOSE del bucle de mensajes de Windows en su formulario de solicitud principal (es decir, que se cerró, termina 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);
}
Una cosa estas respuestas carecen y que los novatos probablemente están buscando para, es que si bien es bueno tener un evento:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
// do something
}
no va a hacer nada en absoluto, a menos que se registre el evento. Poner esto en el constructor de la clase:
this.FormClosing += Form1_FormClosing;
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);
}
como dijo Jon B, pero también querrá comprobar la 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();
}
- basta con ir a la "Program.Designer.cs"
- Descubre la función denominada
protected override void Dispose(bool disposing)
- comentario o eliminar la línea de la
base.Dispose(disposing);
- En lugar de esa línea Escribe el código de la operación de cierre
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 nada en la aplicación de llamada Application.Exit(); para actuar de manera normal mientras que al hacer clic en (X) se minimizará la Aplicación.
- 1. Windows Forms: cómo ocultar el botón Cerrar (x)?
- 2. botón Escape para cerrar Windows Forms forman en C#
- 3. Invalidar NSWindow botón de cierre
- 4. Barras de menú estándar de Windows en Windows Forms
- 5. .NET Windows Forms: interceptando el evento Close X
- 6. Agregar botón de cerrar (rojo x) a .NET ToolTip
- 7. Windows Forms: Entrar presionar tecla activa el botón de enviar?
- 8. ¿Cómo evitar Windows Forms de radio contenedor botón agrupación automática
- 9. C# cerrar estándar
- 10. Parpadeo en una aplicación de Windows Forms
- 11. Restore C# Windows Forms backcolor
- 12. Cómo dibujar un botón personalizado en Window Titlebar con Windows Forms?
- 13. Tab Index en Windows Forms
- 14. Borrando DrawRectangle en Windows Forms
- 15. Windows Forms: capturar MouseWheel
- 16. Windows Forms Separator Control
- 17. Windows Forms - ErrorProvider + DataGridView
- 18. WPF o Windows Forms
- 19. Windows Forms and ShowDialog problema
- 20. wxNotebook Cerrar botón?
- 21. WPF con Windows Forms - STAThread
- 22. establecer Form.Text en Windows Forms Formulario no actualiza el título
- 23. Botón HTML Cerrar ventana
- 24. Learning Windows Forms vs. Windows Presentation Foundation
- 25. ¿Existe una forma estándar de devolver valores desde los cuadros de diálogo personalizados en Windows Forms?
- 26. Interfaz web para la aplicación Windows Forms
- 27. Jump Lists y Windows Forms
- 28. ¿Cómo abrir una nueva ventana en Windows Forms en .NET?
- 29. Windows Forms - Multiple Event Loops
- 30. ¿Cómo se sabe que el usuario ha hecho clic en "X" o en el botón "Cerrar"?
+1 a todos los que sugirieron el evento Form_Closing, que es mi opción favorita personal. – David