2012-10-12 15 views
13

Opracowałem program usługi wygrywania, który odczytuje plik Excel z mojego dysku lokalnego, a następnie zapisz wartości tego pliku do bazy danych, a teraz chcę utworzyć ikonę powiadomienia, która wyświetli komunikat (" Plik Excel zapisany w bazie danych ") po uruchomieniu mojej usługi i zapisze plik Excel do bazy danych.Ikona powiadomienia dla usługi okienkowej

Podaj mi podpowiedzi, jak rozwiązać ten problem.

Odpowiedz

13

Od momentu wejścia w życie Twoja usługa nie będzie mogła wchodzić w interakcje z pulpitem, więc nie może mieć uruchomionego interfejsu użytkownika bezpośrednio z usługi. Musisz zbudować aplikację agenta uruchamiającą się przy logowaniu użytkownika, który może czatować z twoją usługą (może używając WCF).

Oto co MS have to say ow ten sposób:

Dla bardziej złożonych interakcji, programiści powinni przenieść swój kod UI do agenta, który działa w sesji użytkownika i obsługuje wszystkie wymagania UI. Agent komunikuje się z usługą za pośrednictwem usługi RPC lub nazwanych potoków. Jeśli użytkownik zainicjuje interakcję interfejsu użytkownika przy użyciu Panelu sterowania, przeglądarki Internet Explorer lub podobnego interfejsu użytkownika, to interfejs użytkownika powinien uruchomić agenta. Następnie agent obsługuje wszystkie interakcje interfejsu użytkownika. Jeśli interfejs użytkownika jest wymagany, ale nie jest inicjowany przez użytkownika, usługa musi zażądać od agenta uruchomienia dowolnego wymaganego interfejsu użytkownika, zamiast samodzielnie uruchamiać ten interfejs. W rzadkich przypadkach, gdy usługa musi zainicjować interakcję z użytkownikiem, a agent nie jest jeszcze uruchomiony, usługa powinna wywołać interfejs API CreateProcessAsUser, aby uruchomić agenta. Agent może następnie zainicjować wszystkie interakcje interfejsu użytkownika. Ważne jest, aby programiści dokładnie przeanalizowali wszystkie możliwe scenariusze użycia i rozważyli przeniesienie całego kodu UI do agenta działającego w sesji użytkownika.

2

Problem polega na tym, że usługa systemu Windows działa w tle i nie ma wpływu na pulpit użytkownika.

Można by stworzyć aplikację podobną do tego (bez postaci Windows): Notify Icon control in .Net 2.0

A potem użyć czegoś podobnego następnej klasy w aplikacji do komunikowania się z usługą 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 myślę, że potrzebujesz NotifyIcon.ShowBalloonTip Metodę wdrożenia w swojej usłudze. Może być konieczne przeczytanie this.

+0

Kolejny interesujący link, który znalazłem. proszę spojrzeć http://social.msdn.microsoft.com/Forums/da-DK/winforms/thread/2ceda452-1576-4372-8406-a463333800f7 –

+0

masz rację, naprawdę chcę to zrobić, ale myślę, że usługa okna nie może współdziałać z komputerowymi problemami bezpieczeństwa. tutaj jest odniesienie. [link] (http://msdn.microsoft.com/en-us/windows/hardware/gg463353.aspx) –

+0

Następnie nie powinieneś używać programu NotifyIcon ani tworzyć dwóch projektów. Aplikacja systemu Windows i faktyczna usługa. Aplikacja Window będzie wykonywała ograniczone interakcje z usługą i głównie będzie wyświetlać NotifyIcon. –

Powiązane problemy