У меня есть сервис окна для моего приложения. То, когда я останавливаю это путем уничтожения процесса с диспетчером задач, значок панели задач не делает, исчезает. Действительно ли это - ошибка окна или что-то еще? У нас есть решение для той проблемы? Заранее спасибо:).
Нет решения этой проблемы. Если вы завершаете процесс с помощью диспетчера задач, он не получает уведомления о завершении и, следовательно, не может удалить свой значок из панели задач. Постарайтесь таким образом избежать процесса убийства. Вы можете использовать net start / stop
, чтобы убить службу, или services.msc
GUI.
Вы можете позволить значку исчезнуть, вызвав Dispose()-метод указанного NotifyIcon-объекта. В большинстве случаев этот объект Container не является частью дерева компонентов вашего приложения, поэтому он не исчезнет при завершении процесса. Когда пользователь перемещается над иконкой, иконка не находит своего родителя, поэтому она исчезает. Но, вызвав метод 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();
Наведите указатель мыши на значок, и он исчезнет. Я заметил такое поведение во всех версиях Windows, включая Win 7.
Я тоже это часто замечаю в различных приложениях. Смерть приложения заметна только при наведении курсора мыши на значок.
Я думаю, что «ошибка» связана с Windows, а не с вашим приложением. (Я не хочу называть это «ошибкой» как таковой, потому что, вероятно, это было сознательное решение оставить это. Проводник мог проверить, работают ли все еще приложения, которые зарегистрировали значки, но это может быть слишком дорого.)
Я сделал это, обработав событие ThreadException и удалив значок в области уведомлений в этом обработчике событий.
Если приложение принудительно завершается (например, через диспетчер задач), Windows не удаляет значок уведомления. Проводник Windows даже не замечает, что приложение ушло, пока не попытается отправить сообщение (обычно сообщение о движении мыши) в окно, которому принадлежит значок уведомления. В этот момент Windows удалит теперь мертвый значок из области уведомлений.
Учитывая, что вы не можете перехватить TerminateProcess , ваша программа ничего не может с этим поделать сама.
Я предполагаю, что проводник Windows мог наблюдать за разрушением окна владельца (например, когда приложение неожиданно завершает работу), но это не так.
Даже если приложение завершено корректно, оно все равно должно не забыть удалить любые значки уведомлений. То есть: если вы не вызываете Shell_NotifyIcon (NIM_DELETE)
(эквивалент NotifyIcon.Dispose
), когда ваше приложение завершает работу (даже изящно), значок останется там до тех пор, пока мышь перемещается по нему.
Да, и если это служебный процесс, отображающий значок уведомления, имейте в виду, что изоляция сеанса 0 в Windows Vista и Windows 7 нарушит его.