如何使用alt + F4阻止任何Form关闭

时间:2018-05-21 20:13:34

标签: c# .net winforms messagebox formclosing

这不是 How to Disable Alt + F4 closing form? 的副本。请阅读原因。

我在我的主表单下创建了一个自定义MessageBox。

enter image description here

并将“Aight”按钮设置为单击侦听器:

private void Aight_buton_Click(object sender, EventArgs e)
{
    dr = DialogResult.OK;
    Close();
}

“X”按钮的情况也是如此。根据上述问题的答案我可以做到这一点:

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    e.Cancel = e.CloseReason == CloseReason.UserClosing;
}

但由于我在Close()下使用Aight_buton_Click,因此它仍会注册为e.CloseReason == CloseReason.UserClosing;。因此,按键不会关闭我的表单(自定义消息框),也不会 Alt + F4 。我想知道具体如何我只能阻止 Alt + F4 关闭而不是Close()关闭。请不要使用ModifierKeys,因为它不是最合适的,也不是处理这种情况的最聪明方法。

2 个答案:

答案 0 :(得分:5)

在表单中添加bool字段,在true方法中将其设置为Aight_buton_Click,在Form1_FormClosing中仅阻止表单在该字段为false时关闭。< / p>

所以在表单层面:

private bool _isAightButonClicked;

Aight_buton_Click方法中将其设置为true:

private void Aight_buton_Click(object sender, EventArgs e)
{
    _isAightButonClicked = true;
    dr = DialogResult.OK;
    Close(); 
}

Form1_FormClosing方法中使用它:

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    e.Cancel = e.CloseReason == CloseReason.UserClosing && !_isAightButonClicked;
}

答案 1 :(得分:4)

自己处理Atl+F4并设置处理。

在表单构造函数中首先设置

this.KeyPreview = true;

然后处理keyDown事件

 private void Form1_KeyDown(object sender, KeyEventArgs e)
 {
     if (e.Alt && e.KeyCode == Keys.F4)
     {
         e.Handled = true;
     }

 }