TRUCO: Cómo averiguar si una ventana ha sido cerrada por el usuario
Publicado por
José M. Alarcón Aguín
el
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).
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!