Botón C # Forma X Pulsado

¿Cómo puedo saber si un formulario está cerrado haciendo clic en el botón X o mediante (this.Close ())?

el formulario tiene el evento FormClosing con el parámetro de tipo FormClosingEventArgs.

private void Form1_FormClosing( object sender, FormClosingEventArgs e ) { if ( e.CloseReason == CloseReason.UserClosing ) { if ( MessageBox.Show( this, "Really?", "Closing...", MessageBoxButtons.OKCancel, MessageBoxIcon.Question ) == DialogResult.Cancel ) e.Cancel = true; } } 

¿Podrías quitar la ‘X’ por completo?

Una de las propiedades del formulario es “ControlBox”, simplemente configúrelo como false

Si desea establecer el campo devuelto en nulo, como lo hace al hacer clic en Cancelar en su formulario:

 private void Form1_FormClosing( object sender, FormClosingEventArgs e ) { if ( e.CloseReason == CloseReason.UserClosing ) { returnfield = null; this.close(); } } 

Para el OnFormClosing el FormClosingEventArgs.CloseReason es UserClosing ya sea al botón ‘X’ o form.Close() método form.Close() . Mi solución:

 //override the OnFormClosing event protected override void OnFormClosing(FormClosingEventArgs e) { if (e.CloseReason == CloseReason.ApplicationExitCall)// the reason that you need base.OnFormClosing(e); else e.Cancel = true; // cancel if the close reason is not the expected one } //create a new method that allows to handle the close reasons public void closeForm(FormClosingEventArgs e) { if (e.CloseReason == CloseReason.UserClosing) this.Close(); else e.Cancel = true; } //if you want to close the form or deny the X button action invoke closeForm method myForm.closeForm(new FormClosingEventArgs(CloseReason.ApplicationExitCall, false)); //the reason that you want ↑ 

En este ejemplo, el botón cerrar (X) no cierra el formulario