?id=37ce75f9-1591-4b27-aae0-6b13c7318d3b
TRUCO: Cómo averiguar si una ventana ha sido cerrada por el usuario
ATENCIÓN: este contenido tiene más de 2 años de antigüedad y, debido a su temática, podría contener información desactualizada o inexacta en la actualidad.
Las ventanas de Windows (formularios Windows Forms) se pueden cerrar, bien por parte del usuario, o bien mediante programa con el método Close(). Pero ¿cómo distinguir ambos casos?
En Visual Basic "clásico" era muy fácil hacerlo dentro del evento QueryUnload gracias al parámetro UnloadMode. Sin embargo en .NET no es tan sencillo averiguarlo.
Aunque no es tan flexible como el evento QueryUnload mencionado, la solución que se expone a continuación soluciona el problema.
Se trata de subclasificar el procedimiento de la ventana y verificar que el mensaje que se está produciendo es WM_SYSCOMMAND con el parámetro SC_CLOSE, así (en C#):
public const int SC_CLOSE = 0xF060;
public const int WM_SYSCOMMAND = 0x0112;
protected override void WndProc(ref System.Windows.Forms.Message m) {
if(m.Msg == WM_SYSCOMMAND && (int)m.WParam == SC_CLOSE)
//La cerró el usuario
base.WndProc(ref m);
}
Si queremos podemos cancelar el proceso del mensaje para cancelar el cierre de la ventana en caso de que sea el usuario quien lo haya provocado (hay situaciones en las que puede ser muy útil).
Fecha de publicación:
Fundador de campusMVP, es ingeniero industrial y especialista en consultoría de empresa. Ha escrito diversos libros, habiendo publicado hasta la fecha cientos de artículos sobre informática e ingeniería en publicaciones especializadas. Microsoft lo ha reconocido como MVP (Most Valuable Professional) en desarrollo web desde el año 2004 hasta la actualidad. Puedes seguirlo en Twitter en @jm_alarcon o leer sus blog técnico o personal.
Ver todos los posts de José M. Alarcón Aguín
¿Te ha gustado este artículo? ¡Compártelo!