Cómo desactivar el botón e cerrar ventana (la equis) y dejar los botones minimizar y maximizar activos en un formulario en C# (C Sharp) de Visual Studio .Net. Evitar que una aplicación se cierre en C#.
Impedir el cierre de una aplicación en C#
En algunas aplicaciones queremos que, por seguridad, siempre permanezcan abiertas y no puedan ser cerradas. Para ello podremos realizar varias tareas en nuestra aplicación C#, una de ellas es desactivar el botón cerrar (la equis) del formulario/ventana:
Que explicamos cómo hacerlo en esta sección del artículo.
También se puede optar por dejar activo el botón cerrar e invalidar su acción/evento. Es decir, cuando el usuario pulse el botón cerrar de la ventana, invalidar el cierre. Para ello habría que añadir el siguiente código C# en el evento FormClosing del formulario:
1 2 3 4 |
private void formPrincipal_FormClosing(object sender, FormClosingEventArgs e) { e.Cancel = true; } |
De esta forma, aunque se pulsara el botón cerrar o se intentara cerrar la aplicación de cualquier otra forma, por ejemplo ejecutando Application.Exit(), o bien pulsando las teclas Alt + F4, o bien cerrándola desde la barra de tareas, se ejecutaría el evento FormClosing y el código anterior invalidaría el cierre.
Desactivar el botón cerrar de una ventana en C#
Aún así, si queremos desactivar el botón de cerrar formulario, sin código, podremos establecer a False la propiedad ControlBox del formulario:
Pero en este caso, aunque tengamos a True las propiedades MaximizeBox y MinimizeBox, estos botones no aparecerán. Tampoco aparecerá el icono de la aplicación:
Si queremos que se muestren los botones de minimizar y maximizar y, a su vez, que el botón de cerrar esté desactivado, realizaremos las siguientes acciones.
En primer lugar, en los import (using) del formluario agregaremos el siguiente código:
1 |
using System.Runtime.InteropServices; |
A continuación, en la clase del formulario, agregaremos el siguiente código:
1 2 3 4 5 6 7 |
[DllImport("user32")] static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert); [DllImport("user32")] static extern bool EnableMenuItem(IntPtr hMenu, uint uIDEnableItem, uint uEnable); const int MF_BYCOMMAND = 0; const int MF_DISABLED = 2; const int SC_CLOSE = 0xF060; |
En el evento Load del formulario agregaremos el siguiente código:
1 2 3 4 5 |
private void formPrincipal_Load(object sender, EventArgs e) { var sm = GetSystemMenu(Handle, false); EnableMenuItem(sm, SC_CLOSE, MF_BYCOMMAND | MF_DISABLED); } |
Si lo dejáramos así, funcionaría cuando la aplicación se inicia, pero si el usuario minimiza o cambia el tamaño de la ventana o la desenfoca y la enfoca, el botón de cerrar volvería a activarse. Para evitar esto, añadimos el mismo código anterior al evento Resize del formulario:
1 2 3 4 5 |
private void formPrincipal_Resize(object sender, EventArgs e) { var sm = GetSystemMenu(Handle, false); EnableMenuItem(sm, SC_CLOSE, MF_BYCOMMAND | MF_DISABLED); } |
Ahora sí que tendremos el botón de cerrar ventana desactivado y el de minimizar y maximizar visibles y activados:
Desactivando el botón cerrar no impediremos que el usuario cierre la aplicación, podría hacerlo, por ejemplo, pulsando las teclas Alt + F4, o también pulsando con el botón derecho sobre la aplicación en la barra de herramientas y eligiendo «Cerrar …»:
Para evitar este cierre, seguiremos los pasos que indicamos aquí.