2012-10-12 29 views
13

ローカルドライブからExcelファイルを読み取り、このファイル値をデータベースに保存するウィンサービスプログラムを開発しました。今は、通知アイコンを開発して、 Excelファイルはデータベースに保存されます)。サービスが開始され、Excelファイルをデータベースに保存します。ウィンドウサービスのアイコン通知

これを解決するためのヒントを教えてください。

答えて

13

Vista以降では、サービスはデスクトップとやりとりできないため、サービスから直接的にUIを実行することはできません。ユーザーのログイン時に起動し、サービスにチャットできるエージェントアプリケーションを構築する必要があります(おそらくWCFを使用します)。

はここで何MS have to sayこれを行うことについてです:

、より複雑な相互作用のために、開発者がユーザーのセッションで実行され、すべてのUI要件を処理剤中に彼らのUIコードを移動する必要があります。エージェントは、RPCまたは名前付きパイプを介してサービスと通信します。コントロールパネル、Internet Explorerまたは同様のUIエクスペリエンスを使用してユーザーがUIのやりとりを開始した場合、そのUIエクスペリエンスでエージェントが開始されます。エージェントはすべてのUIのやりとりを処理します。 UIが必要であるがユーザによって開始されない場合、サービスは、そのUIを単独で起動するのではなく、必要なUIを開始するようにエージェントに要求する必要があります。サービスがユーザーとの対話を開始し、エージェントがまだ実行されていないまれな状況では、サービスはCreateProcessAsUser APIを呼び出してエージェントを開始する必要があります。エージェントは、すべてのUIのやりとりを開始できます。開発者にとって、使用可能なすべてのシナリオを慎重に確認し、すべてのUIコードをユーザーセッションで実行されるエージェントに移行することを検討することが重要です。

2

ここでの問題は、Windowsサービスがバックグラウンドで実行され、ユーザーのデスクトップに影響を与えないことです。

あなたは(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

私は実際にはしたいが、私はウィンドウサービスと思う右ですセキュリティ上の問題のデスクトップコーズと対話できません。ここに参考です。 [リンク](http://msdn.microsoft.com/en-us/windows/hardware/gg463353.aspx) –

+0

その後、NotifyIconに行ったり、2つのプロジェクトを作成したりしないでください。Windowsアプリケーションと実際のサービス。 Window Appはサービスとの限定されたやりとりを行い、主にNotifyIconを表示します。 –

関連する問題