Иконка в трее не исчезает при убийстве - PullRequest
11 голосов
/ 22 февраля 2010

У меня есть оконный сервис для моего приложения. Когда я прекращаю это, убивая процесс с помощью диспетчера задач, значок в трее не исчезает Это ошибка окна или что-то еще? У нас есть решение этой проблемы? Заранее спасибо:).

Ответы [ 7 ]

8 голосов
/ 22 февраля 2010

Вы можете позволить иконке исчезнуть, вызвав метод 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();
6 голосов
/ 22 февраля 2010

Наведите указатель мыши на значок, и он исчезнет. Я заметил такое поведение во всех версиях Windows, включая Win 7.

5 голосов
/ 22 февраля 2010

Нет решения этой проблемы. Если вы уничтожите процесс с помощью диспетчера задач, он не получит уведомление о завершении, и, следовательно, не может удалить его значок из трея. Старайтесь избегать процесса убийства таким образом. Вы можете использовать net start/stop для уничтожения службы или services.msc GUI.

4 голосов
/ 22 февраля 2010

Я тоже часто замечаю это с различными приложениями. Смерть приложения заметна только при наведении мыши на иконку.

Я думаю, что "ошибка" связана с Windows, а не с вашим приложением. (Я не хочу называть это «ошибкой», по сути, потому что это было, вероятно, сознательное решение оставить это в. Проводник мог проверить, работают ли приложения, которые зарегистрировали значки, но это может быть слишком дорого.)

2 голосов
/ 10 июля 2013

Используйте этот инструмент http://www.codeproject.com/Articles/19620/LP-TrayIconBuster

Он перебирает ToolBarButtons в TrayNotifyWnd & NotifyIconOverflowWindow и удаляет их с пустыми именами файлов.

2 голосов
/ 22 февраля 2010

Если приложение принудительно завершается (например, через диспетчер задач), то Windows не удаляет значок уведомления. Проводник Windows даже не замечает, что приложение исчезло, пока не попытается отправить сообщение (обычно сообщение о движении мыши) в окно, которому принадлежит значок уведомления. В этот момент Windows удалит теперь мертвый значок из области уведомлений.

Учитывая, что вы не можете перехватить TerminateProcess , ваша программа ничего не может с этим поделать.

Я полагаю, что Windows Explorer может наблюдать за разрушением окна владельца (например, когда приложение неожиданно завершает работу), но это не так.

Даже если приложение корректно закрыто, оно все равно должно помнить об удалении любых значков уведомлений. То есть: если вы не вызываете Shell_NotifyIcon(NIM_DELETE) (эквивалент NotifyIcon.Dispose), когда ваше приложение закрывается (даже изящно), значок будет оставаться там до тех пор, пока мышь не наведет на него курсор.

О, и если это сервисный процесс, который отображает значок уведомления, учтите, что изоляция сеанса 0 в Windows Vista и Windows 7 сломает ее.

0 голосов
/ 22 февраля 2010

Я сделал это, обработав событие ThreadException и разместив значок в панели задач в этом обработчике событий.

...