Jak bashmohandes i Dmitriy Matveev już wspomniano, rozwiązanie powinno być FormClosingEventArgs. Ale, jak powiedział również Dmitriy, nie miało to żadnego znaczenia między twoim przyciskiem a X w prawym górnym rogu.
Aby rozróżnić te dwie opcje, można dodać do formularza właściwość boolowską ExitButtonClicked i ustawić ją na wartość true w przycisku Kliknij zdarzenie tuż przed wywołaniem Application.Exit().
Teraz możesz zapytać tę właściwość w zdarzeniu FormClosing i rozróżnić te dwie opcje w ramach sprawy
Przykład:
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, teraz masz poważny błąd. Jeśli wywołasz Application.Exit z obsługi kliknięcia, gdy bliski powód będzie CloseReason.ApplicationExitCall i jeśli (UserClosing) stan będzie bezużyteczny. Powinieneś wywołać metodę To.Close() w module obsługi kliknięcia, aby dopasować przypadek przełącznika UserClosing lub musisz przenieść instrukcję na zewnątrz instrukcji switch. – okutane
Jeśli formularz nie zostanie zamknięty, gdy będziesz w Form1_FormClosing - być może istnieje "czy chcesz wyjść?" pytanie - coś musi ustawić zmienną flag UserClosing na false lub następnym razem może być fałszywa. –