2010-02-22 24 views
11

Tengo un servicio de ventana para mi aplicación. Cuando dejo eso matando el proceso con el administrador de tareas, el icono de la bandeja no desaparece. ¿Es un error de ventana o algo más? ¿Tenemos una solución para ese problema? Gracias por adelantado :).El icono de la bandeja no desaparece al matar el proceso

Respuesta

5

No hay solución a este problema. Si elimina el proceso con el administrador de tareas, no recibe notificación de finalización y, por lo tanto, no puede eliminar su icono de la bandeja. Intenta evitar el proceso de matar de esta manera. Puede usar net start/stop para matar un servicio o services.msc GUI.

5

Mueva el mouse sobre el icono y desaparecerá. Me he dado cuenta de este comportamiento en todas las versiones de Windows, incluido Win 7.

+1

Lo he notado también :) –

+0

Sí, funciona, pero tengo que hacerlo desaparecer por código.Quiero decir que hay un script que mi equipo de pruebas está ejecutando para detener ese servicio y siento que en realidad están matando el proceso en lugar de abandonar el servicio con gracia. Tengo que encontrar una solución para ellos (ya sabes chicos de prueba: D). – Lalit

+2

Esto no es exactamente una solución. Más como un sucio hack sucio. – Will

3

A menudo lo noto también, con varias aplicaciones. La muerte de la aplicación solo se nota cuando mueve el mouse sobre el ícono.

Creo que el "error" es con Windows, no es su aplicación. (Soy reacio a llamarlo un "error", per se, porque probablemente fue una decisión consciente dejar esto. Explorer pudo comprobar si las aplicaciones que registraron íconos aún se están ejecutando, pero eso podría ser muy costoso).

7

Puede dejar que desaparezca el icono llamando al método Dispose() del objeto NotifyIcon especificado. En la mayoría de los casos, este objeto contenedor no forma parte del árbol de componentes de la aplicación, por lo que no desaparecerá al matar el proceso. Cuando el usuario se mueve sobre el ícono, el ícono no lo encuentra principal para que desaparezca. Pero al llamar al método Dispose, desapareció al menos en mis aplicaciones. Por lo tanto:

//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(); 
+0

Gracias, Suena bien pero no sé dónde poner ese código. Eso será genial si me pueden ayudar con eso. – Lalit

+1

Creo que debes definir un método para que cuando la aplicación se cierre llame a ese método. Entonces, si es una aplicación de ventana (con un formulario). Creo que usará de forma reproducible el método Application.Run (yourForm); después de cerrar el formulario, el método se completa, por lo que el método principal continuará. Si ha definido notifyIcon en su clase principal, puede dejar que se disperse después del método Run. Pero, por supuesto, no puedo responder la pregunta en general. Deberá encontrar un hilo que funcione al finalizar su aplicación. –

+0

EDITAR (releí su pregunta): si agrega un método al evento Process.Exited y ese método hace el trabajo, creo que debería funcionar, pero aún no lo he probado. Buena suerte –

2

Si una aplicación está terminada con fuerza (por ejemplo a través del Administrador de tareas), a continuación, Windows no elimina el icono de notificación. Windows Explorer ni siquiera se da cuenta de que la aplicación se ha ido hasta que intenta enviar un mensaje (generalmente un mensaje de movimiento del mouse) a la ventana que posee el ícono de notificación. En ese momento, Windows eliminará el icono ahora muerto del área de notificación.

Dado que can't intercept TerminateProcess, no hay nada que su programa pueda hacer al respecto.

Supongo que Windows Explorer podría estar atento a la destrucción de la ventana del propietario (como cuando la aplicación se cierra inesperadamente), pero no es así.

Incluso si la aplicación se cierra correctamente, debe recordar eliminar todos sus iconos de notificación. Es decir: si no llama al Shell_NotifyIcon(NIM_DELETE) (el equivalente a NotifyIcon.Dispose) cuando su aplicación se apaga (incluso con gracia), el icono permanecerá allí hasta que el mouse se mueva sobre él.

Ah, y si este es un proceso de servicio que muestra el icono de notificación, tenga en cuenta que el aislamiento de sesión 0 en Windows Vista y Windows 7 lo romperá.

0

Lo he hecho manejando el evento ThreadException y desechando el icono de la bandeja en ese controlador de eventos.

+0

Oye, el control no está en marcha ThreadException en el proceso de matar, por lo que no funcionará :(. – Lalit

+0

@ lalit bien, si realmente está utilizando un servicio (es decir, extiende ServiceBase), puede anular el método Dispose. Todo depende exactamente de qué tipo de aplicación tiene y dónde se crea el icono de la bandeja. – Will

+0

@lalit Hmmm .... ¿estás usando un servicio real? (como en, extiende ServiceBase)? Es difícil decirte qué hacer y dónde porque no sabemos * exactamente * qué tipo de aplicación estás desarrollando y cómo estás construyendo el TrayIcon y dónde lo estás almacenando. El código definitivamente ayudaría. Si en realidad está utilizando un servicio y crea el TrayIcon en su clase de servicio (no estoy seguro si eso es posible) puede soltar el TrayIcon en la colección 'this.components' y se eliminará cuando el servicio sea dispuesto. Pero no estoy seguro si así es como lo estás haciendo, por lo tanto, dame código. – Will

Cuestiones relacionadas