Если приложение принудительно завершается (например, через диспетчер задач), то Windows не удаляет значок уведомления. Проводник Windows даже не замечает, что приложение исчезло, пока не попытается отправить сообщение (обычно сообщение о движении мыши) в окно, которому принадлежит значок уведомления. В этот момент Windows удалит теперь мертвый значок из области уведомлений.
Учитывая, что вы не можете перехватить TerminateProcess , ваша программа ничего не может с этим поделать.
Я полагаю, что Windows Explorer может наблюдать за разрушением окна владельца (например, когда приложение неожиданно завершает работу), но это не так.
Даже если приложение корректно закрыто, оно все равно должно помнить об удалении любых значков уведомлений. То есть: если вы не вызываете Shell_NotifyIcon(NIM_DELETE)
(эквивалент NotifyIcon.Dispose
), когда ваше приложение закрывается (даже изящно), значок будет оставаться там до тех пор, пока мышь не наведет на него курсор.
О, и если это сервисный процесс, который отображает значок уведомления, учтите, что изоляция сеанса 0 в Windows Vista и Windows 7 сломает ее.