2012-10-12 3 views
13

로컬 드라이브에서 엑셀 파일을 읽은 다음이 파일 값을 데이터베이스에 저장하는 윈 서비스 프로그램을 개발했습니다. 이제는 메시지를 표시하는 알림 아이콘을 개발하려고합니다. 데이터베이스에 저장된 Excel 파일 ") 서비스가 시작되고 Excel 파일을 데이터베이스에 저장합니다.윈도우 서비스 용 아이콘 알림

이 문제를 해결하기위한 몇 가지 힌트를 제공해주십시오.

답변

13

비스타 이후부터는 서비스가 데스크톱과 상호 작용할 수 없으므로 서비스에서 직접 실행되는 UI를 가질 수 없습니다. 사용자 로그인에서 시작하여 (아마도 WCF를 사용하여) 서비스에 채팅 할 수있는 에이전트 응용 프로그램을 빌드해야합니다.

다음은 무엇 MS have to say이 일에 관하여 :

더 복잡한 상호 작용의 경우, 개발자가 사용자의 세션에서 실행되는 모든 UI 요구 사항을 처리하는 에이전트에 자신의 UI 코드를 이동해야합니다. 에이전트는 RPC 또는 명명 된 파이프를 통해 서비스와 통신합니다. 사용자가 제어판, Internet Explorer 또는 유사한 UI 환경을 사용하여 UI 상호 작용을 시작하면 해당 UI 환경에서 에이전트가 시작됩니다. 그런 다음 에이전트는 모든 UI 상호 작용을 처리합니다. UI가 필요하지만 사용자가 시작하지 않은 경우 서비스는 자체적으로 UI를 시작하는 대신 필요한 모든 UI를 시작하도록 에이전트에 요청해야합니다. 서비스가 사용자 상호 작용을 시작해야하고 에이전트가 아직 실행되고 있지 않은 드문 상황에서는 서비스가 CreateProcessAsUser API를 호출하여 에이전트를 시작해야합니다. 에이전트는 모든 UI 상호 작용을 시작할 수 있습니다. 개발자가 가능한 모든 사용 시나리오를 면밀히 검토하고 모든 UI 코드를 사용자 세션에서 실행되는 에이전트로 이동하는 것을 고려하는 것이 중요합니다.

2

여기서 문제는 Windows 서비스가 백그라운드에서 실행되며 사용자의 데스크톱에 영향을 미치지 않는다는 것입니다.

당신은 (창문 양식없이)이 유사한 응용 프로그램을 만들 수

: Notify Icon control in .Net 2.0

를 다음 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 당신이 필요하다고 생각 NotifyIcon.ShowBalloonTip 귀하의 서비스에 구현하는 방법. this을 읽어야 할 수도 있습니다.

+0

내가 발견 한 또 다른 흥미로운 링크. 제발 좀 봐 http://social.msdn.microsoft.com/Forums/da-DK/winforms/thread/2ceda452-1576-4372-8406-a463333800f7 –

+0

당신은 바로 내가 실제로하고 싶어하지만 나는 창문 서비스라고 생각하고있다. 보안 문제의 데스크탑과 상호 작용할 수 없습니다. 여기는 참고 자료입니다. [link] (http://msdn.microsoft.com/en-us/windows/hardware/gg463353.aspx) –

+0

다음 NotifyIcon 이동하거나 두 projects.A Windows 응용 프로그램 및 실제 서비스를 만들지 않아야합니다. Window App은 서비스와의 제한된 상호 작용을 수행하며 주로 NotifyIcon을 표시합니다. –