为什么我使用Application.Exit()或Form.Close()时,我的NotifyIcon应用程序不能退出?

4

我有一个Windows表单应用程序,它退出到系统托盘Notifyicon。我尝试调用Application.Exit()或Me.Close()来关闭程序,但都无法关闭程序。正确的关闭方式是什么?

1个回答

5
“在结束应用程序之前,将系统托盘图标设为不可见是个好主意,否则,当应用程序停止运行时,它可能会停留在托盘中。” 这段话是指通知区域(系统托盘)并没有真正轮询以确保与图标相对应的句柄仍然存在。因此,如果某些东西没有优雅地退出或者没有清理其通知图标,那么通知区域就无法意识到该窗口句柄已经消失了。你可能以前见过这种情况:有时候你将鼠标移到通知区域上,只要鼠标开始悬停在你知道你已经退出的应用程序的图标上,通知区域就会说:“好吧,闭嘴并让我红起来,看来那个句柄不再存在了”,然后就会消失。
“但是,在我关闭程序后,托盘图标仍然显示,并且所有功能都可以使用。对我来说,似乎程序仍在运行。” 是的,看起来你的应用程序仍在运行。请注意,Application.Exit() 不一定成功 - 有一种重载允许应用程序的其他部分取消请求。所以这是需要检查的事情。
通知图标实际上不会使你的应用程序“存活”,因为它没有在你控制下的消息泵。你的应用程序中有些东西没有退出。
希望这能帮助你走上正确的轨道!

2
嗨,伙计,我现在意识到了问题所在。我像这样实现了“退出到系统托盘”: 在窗体关闭事件处理程序中,设置e.Cancel = true,隐藏窗体并显示通知图标。由于我取消了窗体关闭,未来的窗体关闭也将被取消,这就是问题所在。现在我做的是添加一个全局布尔变量RealExit = False。从托盘图标退出时,将布尔值设置为True。只有在布尔变量为False时才取消窗体关闭事件。它解决了问题。你对这种做法有什么评论?有没有正确的方法来“退出到系统托盘,然后退出”? - Aperture
1
这是合理的。在窗体关闭事件参数中还有一个CloseReason属性。你可以使用if (e.CloseReason == CloseReason.ApplicationExitCall)来完成所有设置。 - Nicholas Piasecki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接