Las ventanas de Windows (formularios Windows Forms) se pueden cerrar bien por parte del usuario, bien mediante programa con el m├ętodo Close(). Pero ┬┐c├│mo distinguir ambos casos?

En Visual Basic 6 era muy f├ícil hacerlo dentro del evento QueryUnload gracias al par├ímetro UnloadMode. Sin embargo en .NET no es tan sencillo averiguarlo. Hoy nos ha surgido la necesidad en un trabajo y lo cierto es que no ten├şa ni idea ya que suelo trabajar m├ís con WebForms, que no se cierran ;-)

Aunque no es tan flexible como el evento QueryUnload mencionado esta soluci├│n hace el trabajo.

Se trata de subclasificar el procedimiento de la ventana (mira mi post sobre Subclasificaci├│n de ventanas en .NET) y verificar que el mensaje que se est├í produciendo es WM_SYSCOMMAND con el par├ímetro SC_CLOSE, as├ş:

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).

💪🏻 ┬┐Este post te ha ayudado?, ┬┐has aprendido algo nuevo?
Pues NO te pido que me invites a un caf├ę... Te pido algo m├ís f├ícil y mucho mejor

Escrito por un humano, no por una IA