如何防止在退出时在系统托盘中留下图标?

Mal*_*ist 14 .net c# system-tray

我的程序在系统托盘中放置一个图标,因为用户可以将其最小化.但是,如果应用程序崩溃,或者我阻止应用程序在VS中运行,它会在其中留下图标,直到我用鼠标悬停它.有时我会向下看,那里会有10个左右的图标.

我可以确保图标消失吗?

JSB*_*ոգչ 21

没有办法做到这一点.Windows不会轮询您的程序以查看它是否仍然存在.因此,您的图标将保留在系统托盘中,直到您要求它离开(正常退出),或者用户执行启动程序调用的操作(例如鼠标悬停).只有这样,shell才知道你的程序已经死了,它需要清理你的图标.

  • 仅仅因为许多程序很糟糕(即没有正确地执行此操作)并不意味着它不可行,也不是你不应该这样做.请参阅我的答案以获得可行的解决方案 - 我提供的#2选项应该可以在.NET,C和C++中使用 - 任何语言都可以让您访问进程句柄以及等待所述句柄发出信号的能力. (4认同)

Mor*_*hai 5

您有多种选择:

1) 编写一个根结构化异常处理程序,确保在退出前销毁图标。这需要一些努力 - 但您基本上可以将自己的未处理异常处理程序添加到 Windows,它将在多种形式的“繁荣”的情况下被调用,然后让您有一些最后的清理机会。

2) 编写一个监视应用程序,它在您的主进程句柄上休眠,并在它醒来时杀死图标(主应用程序已死)。为了使后一种情况正常工作,您可能希望主进程不要杀死图标本身 - 或者您可以创建一种方法来告诉监视器应用程序它应该退出而不破坏图标(让监视器应用程序休眠在进程句柄和命名事件上 - 如果被事件唤醒,那么它只会在主应用程序之后死亡而无需清理)。