Como bashmohandes y Dmitriy Matveev ya se ha mencionado, la solución debe ser el FormClosingEventArgs. Pero como Dmitriy también dijo, esto no haría ninguna diferencia entre tu botón y la X en la esquina superior derecha.
Para distinguir entre estas dos opciones, se puede añadir una propiedad booleana ExitButtonClicked a su forma y configurarlo para cierto en el botón Click-Evento derecha antes de llamar Application.Exit().
Ahora puede solicitar esta propiedad dentro del evento FormClosing y distinguir entre esas dos opciones dentro del caso UserClosing.
Ejemplo:
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, tienes un grave error ahora. Si llama a Application.Exit desde el controlador de clics cuando el motivo cercano será CloseReason.ApplicationExitCall y la condición (UserClosing) será inútil. Debe llamar a este método .Close() en el controlador de clic para que coincida con el caso del conmutador UserClosing o si necesita mover la instrucción if al exterior de la instrucción switch. – okutane
Si alguna vez el formulario no está cerrado una vez que está en Form1_FormClosing, quizás haya un "¿quiso salir?" pregunta: algo necesita establecer la variable del indicador UserClosing en false o la próxima vez que sea falso. –