Почему notifyIcon не исчезает при завершении программы?
Здравствуйте,
Написал программу, с одной формой, прикрепил к этой форме notifyIcon, назначил ему значок.
Если форму закрывать на крестик, то значок в трее нормально исчезает, но если эту программу завершить по другому, то значок остается, а исчезает только при наведении мыши.
Как можно решить эту проблему?
Заранее большое спасибо!
Пробовал, даже если в студии запустить программу, а закрывать нажав на стоп, то иконта остается, а исчезает только при наведении.
Писал вот в этих событиях:
private void OnApplicationExit(object sender, EventArgs e)
{
notifyIcon1.Dispose();
}
VaneS Ri_Lax: значит эти события не вызываются.
Если программу убили через диспетчер - иконка останется, если она сама завершилась\упала\etc -> вы можете корректно сделать Dispose иконки.
VaneS Ri_Lax когда вы нажимаете на стоп, программа убивается студией, это НЕ нормальное завершение работы. Иконка остается, потому что Винде никто не сказал, что ее можно убрать. Когда вы наводите мышку, эксплорер просто пытается связаться с программой, не находит ее, и удаляет у себя иконку.
Станислав Макаров: А если будет вторая программа, которая будет запускать первую и она же будет убивать ее, к примеру так:
Process proc = new Process();
proc.StartInfo.FileName = "D:/dir/Programm.exe";
proc.Start();
proc.Kill();
Можно ли как то через вторую программу попытаться завершить процесс так, чтобы он завершился нормально, как будто на форме нажали красный крестик и т.п.
VaneS Ri_Lax
Давайте по порядку.
Очевидно, что нормально завершить процесс может только он САМ, по собственному желанию. Соответственно, для нормального завершения процесс нужно как-то ПОПРОСИТЬ это сделать.
Как это сделать - зависит от того, что у вас в распоряжении.
Если у вас есть доступ к исходному коду завершаемой программы, то лучше всего использовать средства межпроцессного взаимодействия и сообщать из одного процесса в другой, что ему надо завершиться (можно использовать, например виндовые ивенты).
Если доступа к исходному коду нет, то нужно знать, приложение какого типа вам нужно завершить. Дело в том, что в Винде процесс в общем случае не обязан следить за какой-либо очередью сообщений или сигналами, и абсолютно универсального способа завершить любой процесс не существует. Однако, например, GUI-приложения принято завершать отправкой главному окну сообщения WM_CLOSE, что есть эквивалент нажатия красного крестика. Можете попробовать эту винапишную функцию, ее же использует Диспетчер задач: https://msdn.microsoft.com/en-us/library/ms633492%... . Если у вас сервис или консольное приложение, то с ними другая история, сервисы например управляются спец. вызовами через Service Control Manager.
Станислав Макаров: По порядку,
у меня есть 2 приложения, оба пишу я.
1 приложение что то типа лаунчера, оно запускает второе и висит как процесс. Далее первое приложение на сервере проверяет есть ли обновление. Если обновление есть, 1 приложение должно как то правильно сказать 2-му приложению что ему надо завершиться. Далее первое приложение скачивает какие то файлы, и вновь запускает 1 приложение.
Оба приложения пишу на c#, windows forms.
Вы писали про средства меж процессорного взаимодействия, можно пожалуйста по подробнее?
В каком то смысле это особенность винды. Когда программа завершается некорректно (грохнули в диспетчере задач, остановили в студии) - значок не пропадает, потому что системе не приходит уведомления о том, что значок надо грохнуть. А при наведении винда пытается проверить привязанный процесс, видимо.
Попробуйте грохнуть через диспетчер задачу любую прогу, висящую в трее - будет то же самое.
А если будет вторая программа, которая будет запускать первую и она же будет убивать ее, к примеру так:
Process proc = new Process();
proc.StartInfo.FileName = "D:/dir/Programm.exe";
proc.Start();
proc.Kill();
Можно ли как то через вторую программу попытаться завершить процесс так, чтобы он завершился нормально, как будто на форме нажали красный крестик и т.п.