如何知道用户点击了“X”或“closures”button?

在MSDN中,我发现CloseReason.UserClosing知道用户已经决定closures表单,但我猜这是相同的,无论是单击Xbutton或单击closuresbutton。 那么如何区分这两个我的代码?

谢谢大家。

假设你要求WinForms,你可以使用FormClosing()事件 。 FormClosing()事件在表单closures时触发。

要检测用户是否单击X或CloseButton,可以通过发送者对象获取它。 尝试将发件人转换为Button控件,并validation其名称“CloseButton”。

 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. } 

否则,我从来不需要区分X或CloseButton是否被单击,因为我想在FormClosing事件上执行特定的操作,例如在closuresMDIContainerForm之前closures所有MdiChildren,或者检查未保存的更改。 在这种情况下,根据我的说法,我们并不需要区分哪一个button。

通过ALT + F4closures也会触发FormClosing()事件,因为它会向要求closures的表单发送消息。 您可以通过设置取消事件

 FormClosingEventArgs.Cancel = true. 

在我们的例子中,这将转化为

 e.Cancel = true. 

注意FormClosing()和FormClosed()事件之间的区别。

FormClosing在表单收到要closures的消息时发生,并在closures之前validation是否有任何事情要做。

FormClosed在窗体实际closures时发生,因此在closures之后。

这有帮助吗?

您在MSDN上find的CloseReason枚举只是为了检查用户是否closures应用程序,或者是由于closures或由任务pipe理器closures等。

你可以根据原因做不同的操作,比如:

 void Form_FormClosing(object sender, FormClosingEventArgs e) { if(e.CloseReason == CloseReason.UserClosing) // Prompt user to save his data if(e.CloseReason == CloseReason.WindowsShutDown) // Autosave and clear up ressources } 

但是就像你猜测的那样,点击xbutton,或者右击任务栏并点击'close',或者按Alt F4等等,都没有什么区别。它们都以CloseReason.UserClosing原因结束。

“X”button注册为DialogResult.Cancel所以另一个选项是评估DialogResult

如果您的窗体上有多个button,则可能已经将不同的DialogResult关联到了每个button上,这将为您提供区分每个button的方法。

(例如: btnSubmit.DialogResult = DialogResult.OKbtnClose.DialogResult = Dialogresult.Abort

  public Form1() { InitializeComponent(); this.FormClosing += Form1_FormClosing; } /// <summary> /// Override the Close Form event /// Do something /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Form1_FormClosing(Object sender, FormClosingEventArgs e) { //In case windows is trying to shut down, don't hold the process up if (e.CloseReason == CloseReason.WindowsShutDown) return; if (this.DialogResult == DialogResult.Cancel) { // Assume that X has been clicked and act accordingly. // Confirm user wants to close switch (MessageBox.Show(this, "Are you sure?", "Do you still want ... ?", MessageBoxButtons.YesNo, MessageBoxIcon.Question)) { //Stay on this form case DialogResult.No: e.Cancel = true; break; default: break; } } } 

它确定何时closures应用程序如果表单closures(如果您的应用程序未附加到特定的表单)。

  private void MyForm_FormClosed(object sender, FormClosedEventArgs e) { if (Application.OpenForms.Count == 0) Application.Exit(); } 
 if (this.DialogResult == DialogResult.Cancel) { } else { switch (e.CloseReason) { case CloseReason.UserClosing: e.Cancel = true; break; } } 

如果条件会在用户点击“X”或closures表单上的button时执行。 当用户为其他目的单击Alt + f4时,可以使用else

您可以尝试从devise中添加事件处理程序,如下所示:在devise视图中打开表单,打开属性窗口或按F4,单击事件工具栏button查看Form对象上的事件,在Behavior组中findFormClosing事件,然后双击它。 参考: https : //social.msdn.microsoft.com/Forums/vstudio/en-US/9bdee708-db4b-4e46-a99c-99726fa25cfb/how-do-i-add-formclosing-event?forum=csharpgeneral