¿Cómo saber que el usuario ha hecho clic en “X” o en el botón “Cerrar”?

En MSDN, encontré CloseReason.UserClosing para saber que el usuario había decidido cerrar el formulario, pero supongo que es el mismo tanto para hacer clic en el botón X como para hacer clic en el botón Cerrar. Entonces, ¿cómo puedo diferenciar estos dos en mi código?

Gracias a todos.

Suponiendo que está solicitando WinForms, puede usar el evento FormClosing () . El evento FormClosing () se activa cada vez que se cierra un formulario.

Para detectar si el usuario hizo clic ya sea en X o en su botón Cerrar, puede obtenerlo a través del objeto remitente. Intenta enviar el remitente como un control de Botón, y verifica por su nombre “CloseButton”, por ejemplo.

 private void Form1_FormClosing(object sender, FormClosingEventArgs e) { if (string.Equals((sender as Button).Name, @"CloseButton")) // Do something proper to CloseButton. else // Then assume that X has been clicked and act accordingly. } 

De lo contrario, nunca he necesitado diferenciar si se hizo clic en X o CloseButton, ya que quería realizar algo específico en el evento FormClosing, como cerrar todos los MdiChildren antes de cerrar MDIContainerForm o verificar el evento para ver si hay cambios no guardados. Bajo estas circunstancias, no necesitamos, según yo, diferenciarme de ninguno de los botones.

Al cerrar con ALT + F4 también se activará el evento FormClosing (), ya que envía un mensaje al Formulario que dice que se cierre. Puede cancelar el evento configurando

 FormClosingEventArgs.Cancel = true. 

En nuestro ejemplo, esto se traduciría en

 e.Cancel = true. 

Observe la diferencia entre los eventos FormClosing () y FormClosed () .

FormClosing se produce cuando el formulario recibió el mensaje que se cerrará y verifica si tiene algo que hacer antes de que se cierre.

FormClosed ocurre cuando el formulario está realmente cerrado, por lo tanto, después de que se cierra.

¿Esto ayuda?

La enumeración de CloseReason que encontró en MSDN es solo con el propósito de verificar si el usuario cerró la aplicación, o fue debido a un apagado, o cerrado por el administrador de tareas, etc.

Puedes hacer diferentes acciones, de acuerdo con el motivo, como:

 void Form_FormClosing(object sender, FormClosingEventArgs e) { if(e.CloseReason == CloseReason.UserClosing) // Prompt user to save his data if(e.CloseReason == CloseReason.WindowsShutDown) // Autosave and clear up ressources } 

Pero como ha adivinado, no hay diferencia entre hacer clic en el botón x o hacer clic con el botón derecho en la barra de tareas y hacer clic en “cerrar”, presionar Alt F4 , etc. Todo termina en un motivo CloseReason.UserClosing .

El botón “X” se registra como DialogResult.Cancel por lo que otra opción es evaluar DialogResult .

Si tiene varios botones en su formulario, probablemente ya esté asociando diferentes DialogResult a cada uno y esto le proporcionará los medios para saber la diferencia entre cada botón.

(Ejemplo: btnSubmit.DialogResult = DialogResult.OK , btnClose.DialogResult = Dialogresult.Abort )

  public Form1() { InitializeComponent(); this.FormClosing += Form1_FormClosing; } ///  /// Override the Close Form event /// Do something ///  ///  ///  private void Form1_FormClosing(Object sender, FormClosingEventArgs e) { //In case windows is trying to shut down, don't hold the process up if (e.CloseReason == CloseReason.WindowsShutDown) return; if (this.DialogResult == DialogResult.Cancel) { // Assume that X has been clicked and act accordingly. // Confirm user wants to close switch (MessageBox.Show(this, "Are you sure?", "Do you still want ... ?", MessageBoxButtons.YesNo, MessageBoxIcon.Question)) { //Stay on this form case DialogResult.No: e.Cancel = true; break; default: break; } } } 

Determina cuándo cerrar la aplicación si se cierra un formulario (si su aplicación no está asociada a un formulario específico).

  private void MyForm_FormClosed(object sender, FormClosedEventArgs e) { if (Application.OpenForms.Count == 0) Application.Exit(); } 

Puede intentar agregar el controlador de eventos de este modo: Abra el formulario en la vista de diseño, abra la ventana de propiedades o presione F4, haga clic en el botón de barra de herramientas de eventos para ver eventos en el objeto Formulario, encuentre el evento FormClosing en el grupo Comportamiento y haga doble clic en él. Referencia: https://social.msdn.microsoft.com/Forums/vstudio/en-US/9bdee708-db4b-4e46-a99c-99726fa25cfb/how-do-i-adc-formclosing-event?forum=csharpgeneral

Siempre utilizo un método de cierre de formulario en mis aplicaciones que captura alt + x de mi botón de salida, alt + f4 u otro evento de cierre de formulario que se inició. Todas mis clases tienen el nombre de clase definido como cadena privada mstrClsTitle = "grmRexcel" en este caso, un método de salida que llama al método de cierre de formulario y un método de cierre de formulario. También tengo una statement para el Método de cierre del formulario: this.FormClosing = My Form Closing Form Closing method name .

El código para esto:

 namespace Rexcel_II { public partial class frmRexcel : Form { private string mstrClsTitle = "frmRexcel"; public frmRexcel() { InitializeComponent(); this.FormClosing += frmRexcel_FormClosing; } ///  /// Handles the Button Exit Event executed by the Exit Button Click /// or Alt + x /// ///  ///  ///  private void btnExit_Click(object sender, EventArgs e) { this.Close(); } ///  /// Handles the Form Closing event /// ///  ///  ///  private void frmRexcel_FormClosing(object sender, FormClosingEventArgs e) { // ---- If windows is shutting down, // ---- I don't want to hold up the process if (e.CloseReason == CloseReason.WindowsShutDown) return; { // ---- Ok, Windows is not shutting down so // ---- either btnExit or Alt + x or Alt + f4 has been clicked or // ---- another form closing event was intiated // *) Confirm user wants to close the application switch (MessageBox.Show(this, "Are you sure you want to close the Application?", mstrClsTitle + ".frmRexcel_FormClosing", MessageBoxButtons.YesNo, MessageBoxIcon.Question)) { // ---- *) if No keep the application alive //---- *) else close the application case DialogResult.No: e.Cancel = true; break; default: break; } } } } } 
 if (this.DialogResult == DialogResult.Cancel) { } else { switch (e.CloseReason) { case CloseReason.UserClosing: e.Cancel = true; break; } } 

si la condición se ejecutará cuando el usuario haga clic en ‘X’ o cierre el botón en el formulario. El rest se puede usar cuando el usuario hace clic en Alt + f4 para cualquier otro propósito