Come bashmohandes e Dmitriy Matveev già accennato la soluzione deve essere il FormClosingEventArgs. Ma come Dmitriy ha anche detto, questo non farebbe alcuna differenza tra il tuo pulsante e la X nell'angolo in alto a destra.
Per distinguere tra queste due opzioni, è possibile aggiungere una proprietà booleana ExitButtonClicked al form e impostarlo su true nel pulsante Click-evento prima di chiamare Application.Exit().
Ora è possibile richiedere questa proprietà all'interno dell'evento FormClosing e distinguere tra queste due opzioni all'interno del caso UserClosing.
Esempio:
public bool UserClosing { get; set; }
public FormMain()
{
InitializeComponent();
UserClosing = false;
this.buttonExit.Click += new EventHandler(buttonExit_Click);
this.FormClosing += new FormClosingEventHandler(Form1_FormClosing);
}
void buttonExit_Click(object sender, EventArgs e)
{
UserClosing = true;
this.Close();
}
void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
switch (e.CloseReason)
{
case CloseReason.ApplicationExitCall:
break;
case CloseReason.FormOwnerClosing:
break;
case CloseReason.MdiFormClosing:
break;
case CloseReason.None:
break;
case CloseReason.TaskManagerClosing:
break;
case CloseReason.UserClosing:
if (UserClosing)
{
//what should happen if the user hitted the button?
}
else
{
//what should happen if the user hitted the x in the upper right corner?
}
break;
case CloseReason.WindowsShutDown:
break;
default:
break;
}
// Set it back to false, just for the case e.Cancel was set to true
// and the closing was aborted.
UserClosing = false;
}
Oliver, hai un grave errore ora. Se chiami Application.Exit dal gestore di clic quando il motivo di chiusura sarà CloseReason.ApplicationExitCall e se la condizione (UserClosing) sarà inutile. Dovresti chiamare questo metodo.Close() nel gestore di clic per far corrispondere il caso Switch di UserClosing o devi spostare l'istruzione all'esterno dell'istruzione switch. – okutane
Se il modulo non viene mai chiuso una volta che ti trovi in Form1_FormClosing, forse c'è "hai intenzione di uscire?" domanda: qualcosa deve impostare la variabile flag UserClosing su false o la prossima volta che potrebbe falsamente essere true. –