2012-10-12 4 views
13

He desarrollado un programa de servicio win que lee un archivo excel de mi disco local y guarda estos valores en la base de datos y ahora quiero desarrollar un icono de notificación que se mostrará para mostrar un mensaje (" Archivo de Excel guardado en la base de datos ") después de que se inicie mi servicio y guardará el archivo de Excel en la base de datos.Icono de notificación para servicio de ventana

Por favor dame algunos consejos para resolver esto.

Respuesta

13

Desde Vista en adelante, su servicio no podrá interactuar con el escritorio, por lo que no puede tener una ejecución de UI directamente fuera del servicio. Necesita crear una aplicación de agente que se inicie en el inicio de sesión del usuario que puede conversar con su servicio (tal vez usando WCF).

Esto es lo MS have to say sobre hacer esto:

Para las interacciones más complejas, los desarrolladores deben mover su código de interfaz de usuario en un agente que se ejecuta en la sesión del usuario y se ocupa de todos los requisitos de la interfaz de usuario. El agente se comunica con el servicio a través de RPC o conductos con nombre. Si el usuario inicia la interacción de la interfaz de usuario mediante el Panel de control, Internet Explorer o una experiencia de interfaz de usuario similar, esa experiencia de interfaz de usuario debe iniciar el agente. El agente maneja todas las interacciones de UI. Si se requiere UI pero el usuario no la inicia, el servicio debe solicitar al agente que inicie cualquier UI requerida, en lugar de intentar iniciar esa UI por sí mismo. En la rara situación en que el servicio debe iniciar una interacción del usuario y el agente no se está ejecutando, el servicio debe llamar a la API CreateProcessAsUser para iniciar el agente. El agente puede iniciar todas las interacciones de UI. Es importante que los desarrolladores revisen cuidadosamente todos los posibles escenarios de uso y consideren mover todo el código de UI a un agente que se ejecute en la sesión del usuario.

2

El problema aquí es que un servicio de Windows se ejecuta en segundo plano y no tiene ningún impacto en el escritorio del usuario.

Se puede crear una aplicación similar a esta (sin el formulario ventanas): Notify Icon control in .Net 2.0

Y luego usar algo como la siguiente clase en la aplicación para comunicarse con el servicio de Windows:

public class Program 
{ 
    public int Setting { get; set; } 
} 

[ServiceContract] 
public interface ISettingService 
{ 
    [OperationContract] 
    void SetSetting(int setting); 
} 

public class SettingService : ISettingService 
{ 
    private readonly Program program; 

    public SettingService(Program program) 
    { 
     this.program = program; 
    } 

    public void SetSetting(int setting) 
    { 
     program.Setting = setting; 
    } 
} 

internal class CustomInstanceProvider : IInstanceProvider 
{ 
    private readonly Program program; 

    public CustomInstanceProvider(Program program) 
    { 
     this.program = program; 
    } 

    public object GetInstance(InstanceContext instanceContext, Message message) 
    { 
     return GetInstance(instanceContext); 
    } 

    public object GetInstance(InstanceContext instanceContext) 
    { 
     return new SettingService(program); 
    } 

    public void ReleaseInstance(InstanceContext instanceContext, object instance) 
    { 
     IDisposable disposable = instance as IDisposable; 
     if (disposable != null) 
     { 
      disposable.Dispose(); 
     } 
    } 
} 

internal class CustomInstanceProviderBehaviorAttribute : Attribute, IServiceBehavior 
{ 
    private readonly IInstanceProvider instanceProvider; 

    public CustomInstanceProviderBehaviorAttribute(IInstanceProvider instanceProvider) 
    { 
     this.instanceProvider = instanceProvider; 
    } 

    public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) 
    { 
     foreach (ChannelDispatcher cd in serviceHostBase.ChannelDispatchers) 
     { 
      foreach (EndpointDispatcher ed in cd.Endpoints) 
      { 
       if (!ed.IsSystemEndpoint) 
       { 
        ed.DispatchRuntime.InstanceProvider = instanceProvider; 
       } 
      } 
     } 
    } 

    public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters) { } 
    public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) { } 
} 

public class CustomServiceHost : ServiceHost 
{ 
    private readonly Program p; 

    public CustomServiceHost(Program program, params Uri[] baseAddresses) 
    : base(typeof(SettingService), baseAddresses) 
    { 
     this.p = program; 
    } 

    protected override void OnOpening() 
    { 
     Description.Behaviors.Add(new CustomInstanceProviderBehaviorAttribute(new CustomInstanceProvider(p))); 
     base.OnOpening(); 
    } 
} 
1

I cree que necesita NotifyIcon.ShowBalloonTip Método para implementar en su servicio. Es posible que deba leer this.

+0

Otro enlace interesante que encontré. por favor échale un vistazo http://social.msdn.microsoft.com/Forums/da-DK/winforms/thread/2ceda452-1576-4372-8406-a463333800f7 –

+0

tienes razón, en realidad quiero hacerlo, pero creo que el servicio de ventana no puede interactuar con el escritorio debido a problemas de seguridad. aquí hay referencia. [link] (http://msdn.microsoft.com/en-us/windows/hardware/gg463353.aspx) –

+0

Entonces, o bien no debe ir a NotifyIcon o crear dos proyectos.Una aplicación de Windows y su servicio real. Window App hará una interacción limitada con el servicio y principalmente mostrará NotifyIcon. –

Cuestiones relacionadas