Как запретить оставлять значок в системном трее при выходе? - PullRequest
14 голосов
/ 26 октября 2009

Моя программа помещает значок в системный трей, потому что пользователь может свернуть его. Однако, если приложение вылетает или я прекращаю работу приложения в VS, оно оставляет значок в нем, пока я не наведу на него курсор мыши. Иногда я смотрю туда и там будет около 10 иконок.

Могу ли я убедиться, что значок исчезнет?

Ответы [ 5 ]

21 голосов
/ 26 октября 2009

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

4 голосов
/ 26 октября 2009

У вас есть несколько вариантов:

1) Напишите обработчик корневых структурированных исключений, который обеспечивает уничтожение иконки перед выходом. Это требует некоторых усилий - но вы можете добавить свой собственный обработчик необработанных исключений в Windows, который будет вызываться в случае многих форм «бума», который затем предоставит вам возможность последней очистки.

2) Напишите приложение монитора, которое спит на вашем дескрипторе основных процессов и убивает значок, когда он просыпается (основное приложение умерло). Чтобы этот последний сценарий работал хорошо, вы, вероятно, захотите, чтобы основной процесс НЕ убивал сам значок - или вы могли бы создать способ сообщить приложению монитора, что оно должно выйти без уничтожения значка (оставьте приложение монитора в спящем режиме). как на дескрипторе процесса, так и на именованном событии - и, если его разбудит событие, оно просто умрет без очистки после основного приложения).

3 голосов
/ 26 октября 2009

Вам нужно вызвать 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);
3 голосов
/ 26 октября 2009

Перед выходом установите для свойства NotifyIcon Visible значение false.

0 голосов
/ 20 августа 2015

Мы можем скрыть trayIcon перед закрытием формы. Добавить событие FormClosing

NotifyIcon ni;
...
...
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
     ni.Visible = false;
}
...