Yes, and yes.
Handle the Form.FormClosing event, and it will give you a FormClosingEventArgs as a parameter.
This contains a property
CloseReason[
^] which gives you as much info as you are going to get, and also has a
Cancel[
^] property that you can set to
True
if you want to prevent it closing.
Note: if you always cancel the Form Close, you will seriously annoy your users! Provide some mechanism for them to get out...