У меня есть служба окон для моего приложения. Когда я останавливаю это, убивая процесс с помощью диспетчера задач, значок в трее не исчезает. Это ошибка окна или что-то еще? У нас есть решение этой проблемы? Заранее спасибо:).
Значок лотка не исчезает при убийстве
Ответ 1
Нет решения этой проблемы. Если вы убиваете процесс с помощью диспетчера задач, он не получает уведомления о завершении и, следовательно, не может удалить свой значок из лотка. Попытайтесь избежать процесса убийства таким образом. Вы можете использовать net start/stop
, чтобы убить службу или services.msc
GUI.
Ответ 2
Вы можете отключить значок, вызвав метод Dispose() указанного объекта NotifyIcon. В большинстве случаев этот Контейнер-объект не является частью дерева компонентов в вашем приложении, поэтому он не исчезнет, убив процессы. Когда пользователь перемещается по значку, значок не находит его родительским, поэтому он исчезает. Но, вызывая метод 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();
Ответ 3
Наведите указатель мыши на значок, и он исчезнет. Я заметил это поведение во всех версиях Windows, включая Win 7.
Ответ 4
Я часто замечаю это и с различными приложениями. Смерть приложения замечена только тогда, когда вы наводите мышь на значок.
Я думаю, что "ошибка" связана с Windows, а не с вашим приложением. (Я не хочу называть это "ошибкой", по сути, потому что это, вероятно, было сознательное решение оставить это. Explorer может проверить, все ли запущены приложения, которые зарегистрировали значки, но это может быть слишком дорого.)
Ответ 5
Если приложение принудительно завершено (например, через диспетчер задач), Windows не удаляет значок уведомления. Проводник Windows даже не заметил, что приложение ушло, пока оно не попытается отправить сообщение (обычно сообщение с перемещением мыши) в окно, в котором находится значок уведомления. В этот момент Windows удалит значок из мертвой точки из области уведомлений.
Учитывая, что вы не можете перехватывать TerminateProcess, ничего, что ваша программа может сделать сама по себе.
Я предполагаю, что Windows Explorer может наблюдать за уничтожением окна владельца (как при неожиданном завершении приложения), но это не так.
Даже если приложение закрыто изящно, оно все равно не забудьте удалить любые его значки уведомлений. То есть: если вы не вызываете Shell_NotifyIcon(NIM_DELETE)
(эквивалент NotifyIcon.Dispose
), когда приложение закрывается (даже изящно), значок остается там до тех пор, пока мышь не переместится над ним.
О, и если это процесс обслуживания, отображающий значок уведомления, имейте в виду, что изоляция сеанса 0 в Windows Vista и Windows 7 ее сломает.
Ответ 6
Используйте этот инструмент http://www.codeproject.com/Articles/19620/LP-TrayIconBuster
Он выполняет итерацию через ToolBarButtons в TrayNotifyWnd и NotifyIconOverflowWindow и удаляет те, у которых есть нулевые имена файлов.
Ответ 7
Я сделал это, обработав событие ThreadException и удалив значок в трее в этом обработчике событий.