2011-06-01 16 views
6

Tengo un servicio de Windows que siempre se ejecuta cuando el usuario inicia su estación de trabajo. Este servicio de Windows es crítica y me gustaría mostrar una notificación de globo en el área de notificaciones cuando ocurren ciertas cosas, como se detiene el servicio, se inicia, se reinicia etc.¿Cómo puedo mostrar un globo y un ícono del área de notificación de un servicio de Windows?

Por ejemplo:
enter image description here

Además, ¿Hay alguna manera de mostrar un ícono del área de notificaciones para mi servicio de Windows?

+2

Esta publicación podría ayudar: http://stackoverflow.com/questions/2652254/how-can-i-display-a-system-tray-icon-for-c-window-service Un servicio no puede tener directamente un icono de SysTray. – keyboardP

Respuesta

11

Los días en que los servicios de Windows interactúan directamente con el escritorio han terminado, por lo que debe buscar otra forma.

Lo que he hecho es crear una aplicación WinForms normal que incluye NotifyIcon. El comportamiento de esta aplicación imita al del Administrador de tareas, de modo que se puede ocultar de la barra de tareas y solo se puede ver en la bandeja del sistema. Si hago clic con el botón derecho en el icono de la bandeja del sistema, aparece un menú. Si hago doble clic en el icono, se muestra la ventana de la aplicación.

Para facilitar la comunicación entre la aplicación WinForms y el servicio de Windows, utilizo WCF. Específicamente, utilizo Juval Lowy's Publish-Subscribe Framework, que funciona muy bien para este tipo de situaciones. Ver mi respuesta here para más detalles.

Espero que esto ayude.

-1

Si solo desea enviar un comando simple a su servicio de Windows, puede enviar un mensaje desde su aplicación de usuario de la siguiente manera.

ServiceController myService = new ServiceController("YOUR Service Name"); 
myService.ExecuteCommand(123); // do something; 

Si invalida el método OnCustomCommand de su clase, se extiende el ServiceBase. Podría usar este comando para hacer que el servicio haga algo como volver a cargar un archivo de configuración o cambiar a algún estado.

+2

Su respuesta realmente no coincide con la pregunta. Ryan está intentando trabajar con un icono de bandeja del sistema, no envía comandos al servicio. – Peter

+0

Lo que Matt y yo estamos diciendo es que en lugar de configurar tu servicio para detectar el ingreso de un usuario y agregar un ícono a su barra de tareas. Tenga una aplicación que se ejecute por separado que ponga un ícono en la barra de tareas. Esta aplicación puede acceder al estado y enviar comandos simples al servicio en el método mostrado anteriormente. De esta forma, el icono no desaparecerá si el servicio finaliza. Si desea que esté allí cuando el usuario inicie sesión, agregue un acceso directo a su aplicación en la carpeta de inicio. – JonPen

0

Nuestra nueva (y gratuita) ServiceTray utility le permitirá controlar su servicio desde un icono de bandeja. También mostrará notificaciones pop-up/balloon cuando detecte que su servicio ha cambiado de estado (iniciado-> detenido, etc.).

Cuestiones relacionadas