C# 当用户单击标题栏中的叉号时,如何显示MessageBox提示

C# 当用户单击标题栏中的叉号时,如何显示MessageBox提示,c#,winforms,C#,Winforms,我目前正在开发一个C#Windows窗体应用程序 用户通过loginForm登录后,它将被带到mainForm 我想用这样一种方式对它进行编码:当用户单击mainForm中标题栏上的叉号后,会出现一个提示,询问用户“这将关闭应用程序。是否确认?” 然后是“是”和“否”按钮 如果是,将显示另一个框,“应用程序已关闭!” 如果否,messagebox将关闭,应用程序将继续运行 我目前的代码是: private void mainForm_FormClosing(object sender, Form

我目前正在开发一个C#Windows窗体应用程序

用户通过loginForm登录后,它将被带到mainForm

我想用这样一种方式对它进行编码:当用户单击mainForm中标题栏上的叉号后,会出现一个提示,询问用户“这将关闭应用程序。是否确认?” 然后是“是”和“否”按钮

如果是,将显示另一个框,“应用程序已关闭!”

如果否,messagebox将关闭,应用程序将继续运行

我目前的代码是:

private void mainForm_FormClosing(object sender, FormClosingEventArgs e)
{
    if (MessageBox.Show("This will close down the whole application. Confirm?", "Close Application", MessageBoxButtons.YesNo) == DialogResult.Yes)
    {
        MessageBox.Show("The application has been closed successfully.", "Application Closed!", MessageBoxButtons.OK);
        System.Windows.Forms.Application.Exit();
    }
    else
    {
        this.Activate();
    }   
}
但是,它不起作用

首先,我不知道为什么messagebox会弹出两次以关闭整个事件


其次,如果我单击“否”,表单也将关闭,我无法将其带回。

您应该在
FormClosingEventArgs
中查找Cancel属性: 这应该起作用:

  private void mainForm_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (MessageBox.Show("This will close down the whole application. Confirm?", "Close Application", MessageBoxButtons.YesNo) == DialogResult.Yes)
        {
            MessageBox.Show("The application has been closed successfully.", "Application Closed!", MessageBoxButtons.OK);
        } 
        else 
        {
          e.Cancel = true; 
        }
    }

要取消表单关闭,您需要在else语句中
e.cancel=true。
在真实情况下,您不需要显式退出

试试这个

private void mainForm_FormClosing(object sender, FormClosingEventArgs e)
{
    if (MessageBox.Show("This will close down the whole application. Confirm?", "Close Application", MessageBoxButtons.YesNo) == DialogResult.Yes)
    {
        MessageBox.Show("The application has been closed successfully.", "Application Closed!", MessageBoxButtons.OK);

    }
    else
    {
        e.Cancel = true;
        this.Activate();
    }   
}
我假设您的第二个MessageBox表示它已关闭,如果只是出于测试目的

你可能只想要

private void mainForm_FormClosing(object sender, FormClosingEventArgs e)
{
    if (MessageBox.Show("This will close down the whole application. Confirm?", "Close Application", MessageBoxButtons.YesNo) != DialogResult.Yes)
    {
        e.Cancel = true;
    } 
}
请注意,语句会检查它们是否没有点击yes,而不是点击cancel。这意味着,如果他们点击对话框上的x,则不会将其视为确认

编辑:如果主窗体不是主窗体

好吧,我想我明白你的意思了

我要做的是将我的代码放在FormClosing上面的第二个代码块中,然后在FormClosed事件处理程序中

private void mainForm_FormClosed(Object sender, FormClosedEventArgs e)
{
    MessageBox.Show("The application has been closed successfully.", "Application Closed!", MessageBoxButtons.OK);
    System.Windows.Forms.Application.Exit();
}
这应该对你有帮助

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (MessageBox.Show("Are you sure you want to close?", "Close", MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.No)
            e.Cancel = true;
    }

这将满足您的需要:

private void mainForm_FormClosing(object sender, FormClosingEventArgs e)
{
    if (MessageBox.Show("This will close down the whole application. Confirm?", "Close Application", MessageBoxButtons.YesNo) == DialogResult.Yes)
    {
        MessageBox.Show("The application has been closed successfully.", "Application Closed!", MessageBoxButtons.OK);
    }
    else
    {
        e.Cancel = true;
    }   
}
编辑:要回答第一个问题,请参阅。在应用程序中调用
Exit()
时,所有打开的表单都会引发
FormClosing
事件,包括
mainForm
(仍处于打开状态),因此该事件会引发两次。通常情况下,我希望这样的事情会导致无限递归和文本堆栈溢出,但我认为.NET足够聪明,可以防止这种情况


另一方面,您永远不应该通过调用
Exit()
-这是一种代码味道来关闭程序。

要获得所需的功能,请尝试以下代码:

private void mainForm_FormClosing(object sender, FormClosingEventArgs e)
{
    if (MessageBox.Show("This will close down the whole application. Confirm?", "Close Application", MessageBoxButtons.YesNo) == DialogResult.Yes)
    {
        MessageBox.Show("The application has been closed successfully.", "Application Closed!", MessageBoxButtons.OK);
        //no need to do anything here.
    }
    else
    {
        e.Cancel = true;
    }   
}

你的代码对我来说完美无误

private void exiteProToolStripMenuItem_Click(object sender, EventArgs e)
{
    if (MessageBox.Show("message", "title", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
    {
        Application.Exit();
    }
    else
    {
        this.Activate();
    }   
}

嗨,对不起,我不明白你想说什么。我两次调用它的部分在哪里?您不需要在此处调用
Exit()
,因为应用程序无论如何都将处于关闭过程中。您好,谢谢您的回复。它确实有效。但并非完全是我想要的结果。我在System.Windows.Forms.Application.Exit()中编码的原因;因为我希望整个应用程序结束。不仅仅是形式本身,因为它不是主要形式,我有多种形式。那么我该怎么做呢?哦,主窗体不是主窗体?。好吧,那就把退出电话加回真实情况。嗨,对不起。对此仍然很不确定。你这是什么意思?嗨,这也是我最初问题的一部分。关键是当您这样做时,它会提示窗口两次而不是一次。因此,如果我使用您键入的第一个代码框对其进行编码,您将单击4个“是”窗口。@Thomas好的,我想我现在找到您了。你能试试我上面更新的吗?我目前无法核实。
private void exiteProToolStripMenuItem_Click(object sender, EventArgs e)
{
    if (MessageBox.Show("message", "title", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
    {
        Application.Exit();
    }
    else
    {
        this.Activate();
    }   
}