2011-06-06 75 views
1

我正在开发C#应用程序,当用户单击X时,应用程序在托盘图标内最小化。像这样:无法关闭C#应用程序

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(); 
} 

我在这里错过了什么?

+1

你为什么要调用'this.Close'? – leppie 2011-06-06 10:35:58

+1

记住一些用户讨厌这个功能。他们点击X,他们只想要关闭应用程序。好老的Live Messenger !!! – Andez 2011-06-06 10:48:42

回答

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

+0

哇,不知道你可以检查密切的原因!谢谢 – 0plus1 2011-06-06 10:49:41

+0

+1这是一个非常好的解决方案,它利用了内置的'CloseReason' – 2011-06-06 10:51:10

1

Ciao,如果将Application.Exit替换为Application.ExitThread,它会如何工作?

我其实怕你的代码,当你调用this.Close你做了前面的方法上面的取消...

0

这是对Application.Exit()文档就派上用场了(我粗体强调):

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

0

您可以拨打Environment.Exit(0)其中参数是退出代码。

0

当你调用“this.Close”它将调用“frmChat_FormClosing”,并且你正在设置“e.Cancel = true”这是创建问题,使用一些变量来确定从哪里关闭事件相应地调用并设置e.Cancel。

2

e.Cancel = true线frmChat_FormClosing从关闭阻塞的应用程序。

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

事情是这样的:

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(); 
} 
+0

你确实是对的,我忽略了这个!谢谢 – 0plus1 2011-06-06 10:47:46

0

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