【发布时间】:2011-01-19 16:36:21
【问题描述】:
我的应用程序有一个窗口服务。当我通过使用任务管理器终止进程来停止它时,托盘图标不会消失。它是窗口错误还是其他什么?我们有解决这个问题的办法吗?在此先感谢:)。
【问题讨论】:
标签: windows-services windows-xp c#-2.0
我的应用程序有一个窗口服务。当我通过使用任务管理器终止进程来停止它时,托盘图标不会消失。它是窗口错误还是其他什么?我们有解决这个问题的办法吗?在此先感谢:)。
【问题讨论】:
标签: windows-services windows-xp c#-2.0
您可以通过调用指定的 NotifyIcon 对象的 Dispose() 方法让图标消失。在大多数情况下,这些容器对象不是应用程序中组件树的一部分,因此它不会因终止进程而消失。当用户在图标上移动时,图标找不到它的父级,因此它消失了。但是通过调用 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();
【讨论】:
这个问题没有解决办法。如果您使用任务管理器终止进程,它不会收到终止通知,因此无法从托盘中删除其图标。尝试以这种方式避免杀死进程。您可以使用net start/stop 杀死服务或使用services.msc GUI。
【讨论】:
使用这个工具http://www.codeproject.com/Articles/19620/LP-TrayIconBuster
它遍历 TrayNotifyWnd 和 NotifyIconOverflowWindow 中的 ToolBarButtons 并删除那些具有空文件名的按钮。
【讨论】:
将鼠标移到图标上,它就会消失。我在所有版本的 Windows 中都注意到了这种行为,包括 Win 7。
【讨论】:
在各种应用程序中,我也经常注意到这一点。只有当您将鼠标移到图标上时,才会注意到应用程序的死亡。
我认为“错误”在于 Windows,而不是您的应用程序。 (我不愿将其称为“错误”,因为这可能是一个有意识的决定,将其留在其中。资源管理器可以检查注册图标的应用程序是否仍在运行,但这可能太贵了。)
【讨论】:
如果应用程序被强制终止(例如通过任务管理器),则 Windows 不会删除通知图标。 Windows 资源管理器甚至不会注意到应用程序已经消失,直到它尝试向拥有通知图标的窗口发送消息(通常是鼠标移动消息)。届时,Windows 将从通知区域中删除现已失效的图标。
鉴于您是 can't intercept TerminateProcess,您的程序无法自行解决此问题。
我猜想 Windows 资源管理器可以监视所有者窗口被破坏(当应用程序意外退出时),但它没有。
即使应用程序正常关闭,它仍必须记住删除其任何通知图标。也就是说:如果您在应用程序关闭时(甚至是正常关闭)不调用Shell_NotifyIcon(NIM_DELETE)(相当于NotifyIcon.Dispose),则图标将一直保留在那里,直到鼠标移到它上面。
哦,如果这是显示通知图标的服务进程,请注意 Windows Vista 和 Windows 7 中的会话 0 隔离会破坏它。
【讨论】:
我通过处理ThreadException 事件并在该事件处理程序中处理托盘图标来完成它。
【讨论】:
this.components 集合中,它会在服务被释放时被释放。但我不确定你是不是这样做的,所以给我代码。