visual c# notifyicon

c# - visual - NotifyIcon permanece en la bandeja incluso después del cierre de la aplicación, pero desaparece en Mouse Hover



notifyicon c# windows 10 (12)

Este es un comportamiento normal, lamentablemente; se debe a la forma en que funciona Windows. No puedes hacer nada al respecto.

Vea el problema con NotifyIcon que no desaparece de la aplicación Winforms para obtener algunas sugerencias, pero ninguna de ellas funcionó para mí.

También vea Notificar el icono permanece en la bandeja del sistema en la aplicación Cerrar

Microsoft marcó esto como "no se corregirá" en Microsoft Connect.

Hay muchas preguntas sobre SO que formulan la misma duda. La solución para esto es establecer

notifyIcon.icon = null y llamando a Dispose para ello en el evento FormClosing.

En mi aplicación, no existe dicho formulario, pero tiene el ícono de Notificación que se actualiza en Eventos. En la creación, ShowInTaskbar mi formulario y hago que la propiedad ShowInTaskbar false . Por lo tanto, no puedo tener eventos "FormClosing" o "FormClosed".

Si esta aplicación obtiene un evento para salir, llama a Process.GetCurrentProcess().Kill(); salir.

He agregado notifyIcon.icon = null , así como Dispose antes de matar, pero el icono sigue siendo barra de tareas hasta que coloco el mouse sobre él.

EDITAR : si asumo que este comportamiento se debe a llamar a GetCurrentProcess().Kill() , ¿hay alguna manera elegante de salir de la aplicación que borrará todos los recursos y eliminará el icono de la bandeja del sistema?


Intenté este código. Creo que esto es más fácil. Lo escribiré para varias herramientas o eventos. Espero que sea útil para ti.

Utilice este código cuando desee hacerlo cuando presione el botón Salir o Cerrar:

private void ExitButton_Click(object sender, EventArgs e) { notifyIcon.Dispose; Application.Exit(); // or this.Close(); }

Use este código cuando desee hacerlo cuando el formulario se cierre:

private void Form1_FormClosing(object sender, EventArgs e) { notifyIcon.Dispose; Application.Exit(); // or this.Close(); }

El código importante es este:

notifyIcon.Dispose;


La única solución que funcionó para mí fue utilizar el evento Cerrado y ocultar y eliminar el ícono.

icon.BalloonTipClosed += (sender, e) => { var thisIcon = (NotifyIcon)sender; thisIcon.Visible = false; thisIcon.Dispose(); };


La respuesta correcta ya ha sido dada. Pero también debe proporcionar un retraso, por ejemplo, con un temporizador. Solo entonces la aplicación puede eliminar el ícono en segundo plano.

private System.Windows.Forms.Timer mCloseAppTimer; private void ExitButton_Click(object sender, EventArgs e) { notifyIcon.Visible = false; notifyIcon.Dispose; mCloseAppTimer = new System.Windows.Forms.Timer(); mCloseAppTimer.Interval = 100; mCloseAppTimer.Tick += new EventHandler(OnCloseAppTimerTick); } private void OnCloseAppTimerTick(object sender, EventArgs e) { Environment.Exit(0); // other exit codes are also possible }


Los componentes solo deben ser eliminados en el orden correcto de esta manera:

NotifyIcon.Icon.Dispose(); NotifyIcon.Dispose();

Agregue esto al evento de cierre MainWindow .

Espero que esto ayude


No creo que WPF tenga su propio NotifyIcon, ¿o sí? Si está usando HarCont.Wpf.TaskbarNotification, intente esto:

Para evitar que mi aplicación se cierre cuando la ventana se cierra (se ejecuta en segundo plano), separé la lógica para cerrar la ventana (presionar el botón x en la esquina superior derecha) y cerrarla (a través del menú contextual). Para que esto funcione, configure el menú contextual _isExplicitClose como verdadero. De lo contrario, simplemente ocultará la ventana y continuará ejecutándose.

Lo que hace es, al cerrar explícitamente, ocultar el ícono de la bandeja y el formulario antes de cerrar. De esta forma, el ícono no se quedará después de que se cierre la aplicación.

private bool _isExplicitClose; protected override void OnClosing(System.ComponentModel.CancelEventArgs e) { base.OnClosing(e); if (!_isExplicitClose) { e.Cancel = true; Hide(); } } protected void QuitService(object sender, RoutedEventArgs e) { _isExplicitClose = true; TaskbarIcon.Visibility = Visibility.Hidden; Close(); }


Pruebe Application.DoEvents(); después de configurar notifyIcon.Icon para notifyIcon.Icon y eliminar:

notifyIcon.Icon = null; notifyIcon.Dispose(); Application.DoEvents();

Y considere Environment.Exit(0); en lugar de Process.GetCurrentProcess().Kill() .


Puedo decir que puedes resolver el problema simplemente usando el método .dispose (), pero que no se llama si matas el proceso en lugar de salir de la aplicación.

Consulte Application.Exit si ha creado una aplicación simple de Windows Form; de lo contrario, consulte Environment.Exit que es más general.



Use notifyIcon.Visible = False en el evento FormClosing


Usted puede establecer

notifyIcon1.Visible = false;

O

notifyIcon.Icon = null;

en el evento de cierre de formulario.


edite los códigos de ... Designer.cs como la codificación a continuación.

protected override void Dispose(bool disposing) { if (disposing ) { this.notifyicon.Dispose(); } base.Dispose(disposing); }