Как предотвратить оставление значка в системном лотке при выходе?
Моя программа помещает значок в системный лоток, потому что пользователь может свести к минимуму его. Однако, если приложение сработает, или я прекратил запуск приложения в VS, он оставляет значок в нем, пока я не надвигаюсь над ним с помощью мыши. Иногда я буду смотреть вниз, и будет около 10 значков.
Я могу убедиться, что значок исчезнет?
Ответы
Ответ 1
Нет никакого способа сделать это. Windows не проверяет вашу программу, чтобы убедиться, что она еще жива. Таким образом, ваш значок останется в системном трее, пока вы не скажете ему оставить (обычный выход), или пользователь сделает что-то, что инициирует вызов вашей программы (например, наведение мыши). Только тогда оболочка знает, что ваша программа умерла, и она должна очистить вашу иконку.
Ответ 2
У вас есть несколько вариантов:
1) Напишите корневой структурированный обработчик исключений, который обеспечивает уничтожение значка перед выходом. Это требует некоторых усилий, но вы можете в принципе добавить свой собственный обработчик исключенных обработчиков в Windows, который будет вызываться в случае многих форм "бум", который затем позволит вам воспользоваться возможностью последней очистки.
2) Запишите приложение монитора, которое спит на вашем основном процессе, обрабатывает и убивает значок, когда он просыпается (основное приложение скончалось). Чтобы этот последний сценарий работал хорошо, вы, скорее всего, захотите, чтобы основной процесс НЕ убивал сам значок - или вы могли бы создать способ сообщить приложению монитора, что он должен выйти без разрушения значка (иметь сон приложения монитора как на дескрипторе процесса, так и на именованном событии - и, если его пробуждает событие, он просто умирает без очистки после основного приложения).
Ответ 3
Перед тем, как выйти, установите для свойства NotifyIcon Visible значение false.
Ответ 4
Вам нужно вызвать Dispose на NotifyIcon, чтобы он покинул лоток.
РЕДАКТИРОВАТЬ: Там вы можете подключиться к программе Program.cs. Для всех приложений Windows у вас будет что-то вроде этого:
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
В классе Application есть несколько событий, которые вы можете использовать, чтобы знать, когда ваше приложение умирает:
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
Application.ApplicationExit += new EventHandler(Application_ApplicationExit);
Ответ 5
Мы можем скрыть trayIcon до закрытия формы.
Добавить событие FormClosing
NotifyIcon ni;
...
...
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
ni.Visible = false;
}