无法关闭C#应用程序

时间:2011-06-06 10:34:39

标签: c#

我正在开发一个C#应用程序,当用户点击X时,应用程序在trayicon内被最小化。像这样:

private void frmChat_FormClosing(object sender, FormClosingEventArgs e)
{
    e.Cancel = true;
    Hide();
}

应用程序非常简单(只有一种形式)。问题是我无法正确关闭应用程序。当用户权限点击托盘图标并且他选择“退出”时,他应该能够关闭该应用程序。问题是,即使托盘图标被卸载并且窗体关闭,应用程序仍然会在Task Manager中显示为活动应用程序。我正在关闭这样的应用程序:

private void chiudiToolStripMenuItem_Click(object sender, EventArgs e)
{
    trayIcon.Dispose();
    this.Close();
    Application.Exit();
}

我在这里缺少什么?

7 个答案:

答案 0 :(得分:5)

我做了类似的事情。

您需要知道导致表单关闭的原因。因此,当您单击X时,会有一个特定的原因传递给FormClosing事件。像这样:

private void MyForm_FormClosing(object sender, FormClosingEventArgs e)
{
    // don't close just yet if we click on x
    if (e.CloseReason == CloseReason.UserClosing)
    {
        e.Cancel = true;
        this.Hide();
    }
}

另外,我还有上下文菜单中的其他代码退出点击:

private void tsmiExit_Click(object sender, EventArgs e)
{
    // close the application forefully
    TerminateApplication();
}

/// <summary>
/// Closes the Application.
/// </summary>
private void TerminateApplication()
{
    // need to forcefully dispose of notification icon
    this.notifyIcon1.Dispose();

    // and exit the application
    Application.Exit();
}

修改

注意:单击X按钮时,关闭原因将是CloseReason.UserClosing。调用Application.Exit时,使用CloseReason.ApplicationExitCall再次调用FormClosing。

结束编辑:

希望这有帮助

Andez

答案 1 :(得分:2)

e.Cancel = true中的frmChat_FormClosing行阻止了应用关闭。

您可以通过向表单类添加一个名为TerminatingApp的布尔字段来轻松解决此问题。在调用this.Close()之前将其设置为true。在frmChat_FormClosing内查看TerminatingApp的值,如果e.Cancel = true为false,则仅设置TerminatingApp

这样的事情:

private void frmChat_FormClosing(object sender, FormClosingEventArgs e)
{
    if (!TerminatingApp)
    {
        e.Cancel = true;
        Hide();
    }
}

private void chiudiToolStripMenuItem_Click(object sender, EventArgs e)
{
    TerminatingApp = true;
    trayIcon.Dispose();
    this.Close();
    Application.Exit();
}

答案 2 :(得分:1)

Ciao,如果将Application.Exit替换为Application.ExitThread,该怎么办?

我实际上害怕用你的代码,当你打电话给这个时。关闭你正在进入上面的方法并取消...

答案 3 :(得分:0)

这是Application.Exit()上的文档派上用场的地方(我强调的粗体):

  

Exit方法停止所有运行   所有线程上的消息循环和   关闭应用程序的所有窗口。   此方法不一定强制应用程序退出。   退出方法通常从中调用   在消息循环中,强制运行   回来。退出消息循环   只有当前线程,调用   ExitThread

答案 4 :(得分:0)

您可以调用Environment.Exit(0),其中参数是退出代码。

答案 5 :(得分:0)

当您调用“this.Close”时,它将调用“frmChat_FormClosing”,并且您正在设置“e.Cancel = true”,这会产生问题,请使用一些变量来识别调用close事件的位置并相应地设置e.Cancel。

答案 6 :(得分:0)

我试过了Environment.Exit(0)。它适用于这种情况,它对我来说很好。