Assuming you're asking for WinForms, you may use the FormClosing() event. The event FormClosing() is triggered any time a form is to get closed.
To detect if the user clicked either X or your CloseButton, you may get it through the sender object. Try to cast sender as a Button control, and verify perhaps for its name "CloseButton", for instance.
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.
}
Otherwise, I have never ever needed to differentiate whether X or CloseButton was clicked, as I wanted to perform something specific on the FormClosing event, like closing all MdiChildren before closing the MDIContainerForm, or event checking for unsaved changes. Under these circumstances, we don't need, according to me, to differentiate from either buttons.
EDIT Closing by [ALT]+[F4] will also trigger the FormClosing() event, as it sends a message to the Form that says to close. You may cancel the event by setting the
FormClosingEventArgs.Cancel = true.
In our example, this would translate to be
e.Cancel = true.
Notice the difference between the FormClosing() and the FormClosed() events.
FormClosing occurs when the form received the message to be closed, and verify whether it has something to do before it is closed.
FormClosed occurs when the form is actually closed, so after it is closed.
Does this help?