我正在开发一个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();
}
我在这里缺少什么?
答案 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)
。它适用于这种情况,它对我来说很好。