我的应用程序有一个窗口服务。当我通过使用任务管理器终止进程来停止时,托盘图标不会消失。它是一个窗口错误或其他什么?我们有解决方案吗?在此先感谢:)。
答案 0 :(得分:8)
您可以通过调用指定NotifyIcon对象的Dispose()方法让图标消失。在大多数情况下,这些Container-object不是应用程序中组件树的一部分,因此它不会通过终止进程而消失。当用户移动图标时,图标不会找到它的父级,因此它会消失。但是通过调用Dispose方法,它至少在我的应用程序中消失了。所以:
//creating a NotifyIcon
NotifyIcon notifyicon = new NotifyIcon();
notifyicon.Text = "Text";
notifyicon.Visible = true;
notifyicon.Icon = new Icon(GetType(),"Icon.ico");
//let it disappear
notifyicon.Dispose();
答案 1 :(得分:6)
将鼠标移到图标上,它将消失。我在所有版本的Windows中都注意到了这种行为,包括Win 7.
答案 2 :(得分:5)
此问题无法解决。如果您使用任务管理器终止进程,则它不会收到终止通知,因此无法从托盘中删除其图标。尝试以这种方式避免杀戮过程您可以使用net start/stop
来终止服务或services.msc
GUI。
答案 3 :(得分:4)
我经常注意到各种应用程序。只有当您将鼠标移到图标上时才会注意到应用程序的死亡。
我认为“bug”是Windows,而不是你的应用程序。 (我不愿意把它称为“bug”,因为它可能是一个有意识的决定让它进入。资源管理器可以检查注册图标的应用程序是否仍在运行,但这可能太昂贵。)
答案 4 :(得分:2)
如果强行终止某个应用程序(例如通过任务管理器),则Windows不会删除该通知图标。 Windows资源管理器甚至没有注意到应用程序已经消失,直到它尝试向拥有通知图标的窗口发送消息(通常是鼠标移动消息)。此时,Windows将从通知区域中删除现已死亡的图标。
鉴于你can't intercept TerminateProcess,你的程序本身无法做到这一点。
我想Windows资源管理器可以监视所有者窗口被销毁(当应用程序意外退出时),但事实并非如此。
即使应用程序正常关闭,它仍然必须记住删除其任何通知图标。也就是说:如果你的应用程序关闭时(甚至优雅地)没有调用Shell_NotifyIcon(NIM_DELETE)
(相当于NotifyIcon.Dispose
),图标将保持不变,直到鼠标移过它。
哦,如果这是一个显示通知图标的服务进程,请注意Windows Vista和Windows 7中的会话0隔离会破坏它。
答案 5 :(得分:2)
使用此工具http://www.codeproject.com/Articles/19620/LP-TrayIconBuster
它遍历TrayNotifyWnd&中的ToolBarButtons。 NotifyIconOverflowWindow并删除具有空文件名的那些。
答案 6 :(得分:0)
我是通过处理ThreadException事件并在该事件处理程序中放置托盘图标来完成的。