visual unload form evento event control closing close cerrar c# .net winforms formclosing

unload - form formclosing event c#



¿Cómo puedo evitar que un usuario cierre mi aplicación C#? (4)

¿Cómo hacer una aplicación no cerrada en C #? Quiero desactivar el botón ''X'' del formulario e impedir que el Administrador de tareas de Windows también lo cierre.

Sé que una forma de evitar que se cierre un formulario es manejar el evento FormClosing , pero ¿cómo evito que el administrador de tareas lo cierre?


Nunca debe hacer cosas como esta, pero si realmente lo necesita, debe crear un servicio.


Esta no es una respuesta a la pregunta, pero creo que podría ser importante señalar que no siempre es inválido crear una aplicación que el usuario tiene que hacer todo lo posible para terminar. En el caso de una aplicación privada interna que está diseñada para ejecutarse en máquinas propiedad de una empresa y operada por empleados de la empresa que utilizan la aplicación para realizar su trabajo como empleados, sería perfectamente legítimo obligar a la aplicación a seguir funcionando . @TvmMurthy pregunta parece estar lidiando exactamente con esta situación.

En mi propio trabajo, MS Outlook se inicia como una de las aplicaciones de inicio de mi estación de trabajo, y lo dejo funcionando todo el día y en varios días hasta que reinicie la máquina. También escribí aplicaciones de Windows Form que me mantienen informado sobre el estado de los procesos que soy responsable de monitorear en algunos de nuestros servidores. Escribí estas aplicaciones específicamente para seguir funcionando todo el tiempo, y solo se manifiestan como ventanas emergentes cuando se detecta algo que necesito saber (se minimizan en la barra de herramientas para mantenerlos fuera del camino). Uso SharpReader para mantenerme al día con mis feeds RSS, y está diseñado naturalmente para ejecutarse constantemente. Se minimiza a la barra de herramientas, incluso si hace clic en la X roja, y solo puede finalizar mediante un menú contextual desde la barra de herramientas o mediante el Administrador de tareas, y esto es perfectamente razonable, ¡incluso esperado, dada su función!

Los desarrolladores no deben suponer que todas las aplicaciones son instaladas voluntariamente y utilizadas por usuarios que tienen la libertad de ejecutar cualquier software que deseen y cuando deseen usarlo, o que sus propias preferencias sean las que rigen la industria u otros usuarios. Son los requisitos comerciales los que rigen el comportamiento de las aplicaciones, no los prejuicios de los desarrolladores. Como desarrollador que trabaja en la industria, me han pedido que escriba muchos comportamientos en el software que no habría escrito si hubiera estado escribiendo el software para mí .

Bajar la votación de una pregunta porque no le gusta lo que el usuario ha sido claramente dirigido a diseñar en su aplicación muestra una especie de mezquindad o falta de atención que no es particularmente encomiable. Cuestión votada para contrarrestar esto.


No es tan difícil proteger un proceso de ser asesinado por usuarios regulares. Una aplicación puede modificar su propia ACL de proceso impidiendo que CUALQUIER administrador de tareas la elimine. Simplemente obtendrán un "Acceso denegado". cuando intentas matar el proceso

Sin embargo, siempre debe permitir que los administradores puedan matar el proceso para que no interfiera con el cierre del sistema u otras tareas administrativas.

Podría proporcionarle un código, si es necesario.


No, no es posible evitar que Task Manager cierre su aplicación. El Administrador de tareas puede terminar a la fuerza un proceso que no responde; no necesita el permiso de la aplicación para cerrarlo, y tampoco pregunta bien. (Consulte esta respuesta para obtener más información sobre el Administrador de tareas y una comparación entre las diferentes formas en que se puede cerrar una aplicación).

La única solución concebible es tener dos procesos, cada uno de ellos configurado para detectar cuando el otro está cerrado y poner en marcha una nueva instancia. Por supuesto, esto no impedirá que uno de los procesos sea eliminado, solo le permitirá reiniciarlo. Y esto probablemente entra en la categoría de comportamiento hostil con el usuario. Si he recurrido al uso del Administrador de tareas para cerrar su aplicación, probablemente quiera que se vaya, sin importar lo que usted, como programador, desee. Y estoy seguro de que estaré enojado si sigue dando vueltas a nuevos procesos (también es probable que esté loco es mi escáner de virus, porque antes ha visto este tipo de comportamiento).

Recomiendo que reconsideres el diseño de tu aplicación. Si necesita algo que se ejecute todo el tiempo en segundo plano, debe crear un servicio de Windows. Por supuesto, los servicios no tienen una interfaz de usuario, y parece que su aplicación requiere una. Mejor aún, escriba su código a la defensiva: guarde el estado de la aplicación para que pueda cerrarse y restaurarse a voluntad. Tienes que manejar el caso donde la computadora se está apagando de todos modos, entonces, ¿qué tan difícil es manejar solo que se cierre tu aplicación?

Como Raymond Chen de Microsoft le diría, Windows no tiene un mecanismo para esto porque nadie podría haber imaginado una aplicación tan impresionante como la suya que ningún usuario querría cerrar.

En cuanto a deshabilitar el cuadro de cierre de su formulario, el ícono de cerrar en el menú del sistema / ventana y la combinación de teclas Alt + F4 , esto es relativamente sencillo. Deberá sobrescribir la propiedad CreateParams su formulario y establecer el estilo de clase de ventana CS_NOCLOSE :

protected override CreateParams CreateParams { get { const int CS_NOCLOSE = 0x200; CreateParams cp = base.CreateParams; cp.ClassStyle |= CS_NOCLOSE; return cp; } }

Compilar y ejecutar Obtendrá un formulario que se ve así (tenga en cuenta el botón de cierre desactivado en la barra de título y la ausencia de un elemento de menú "Cerrar" en el menú del sistema / ventana):

Tenga en cuenta que al hacer esto, realmente debe proporcionar un mecanismo alternativo dentro de la interfaz de su aplicación para cerrar el formulario. Por ejemplo, en el formulario "maestro" desde el que se muestra este cuadro de diálogo.