Значок панели задач не делает исчезает при уничтожении процесса

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

11
задан tabdiukov 29 November 2019 в 16:52
поделиться

6 ответов

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

5
ответ дан 3 December 2019 в 03:35
поделиться

Вы можете позволить значку исчезнуть, вызвав 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();
8
ответ дан 3 December 2019 в 03:35
поделиться

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

6
ответ дан 3 December 2019 в 03:35
поделиться

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

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

4
ответ дан 3 December 2019 в 03:35
поделиться

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

0
ответ дан 3 December 2019 в 03:35
поделиться

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

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

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

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

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

2
ответ дан 3 December 2019 в 03:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: