ローカルドライブからExcelファイルを読み取り、このファイル値をデータベースに保存するウィンサービスプログラムを開発しました。今は、通知アイコンを開発して、 Excelファイルはデータベースに保存されます)。サービスが開始され、Excelファイルをデータベースに保存します。ウィンドウサービスのアイコン通知
これを解決するためのヒントを教えてください。
ローカルドライブからExcelファイルを読み取り、このファイル値をデータベースに保存するウィンサービスプログラムを開発しました。今は、通知アイコンを開発して、 Excelファイルはデータベースに保存されます)。サービスが開始され、Excelファイルをデータベースに保存します。ウィンドウサービスのアイコン通知
これを解決するためのヒントを教えてください。
Vista以降では、サービスはデスクトップとやりとりできないため、サービスから直接的にUIを実行することはできません。ユーザーのログイン時に起動し、サービスにチャットできるエージェントアプリケーションを構築する必要があります(おそらくWCFを使用します)。
はここで何MS have to sayこれを行うことについてです:
、より複雑な相互作用のために、開発者がユーザーのセッションで実行され、すべてのUI要件を処理剤中に彼らのUIコードを移動する必要があります。エージェントは、RPCまたは名前付きパイプを介してサービスと通信します。コントロールパネル、Internet Explorerまたは同様のUIエクスペリエンスを使用してユーザーがUIのやりとりを開始した場合、そのUIエクスペリエンスでエージェントが開始されます。エージェントはすべてのUIのやりとりを処理します。 UIが必要であるがユーザによって開始されない場合、サービスは、そのUIを単独で起動するのではなく、必要なUIを開始するようにエージェントに要求する必要があります。サービスがユーザーとの対話を開始し、エージェントがまだ実行されていないまれな状況では、サービスはCreateProcessAsUser APIを呼び出してエージェントを開始する必要があります。エージェントは、すべてのUIのやりとりを開始できます。開発者にとって、使用可能なすべてのシナリオを慎重に確認し、すべてのUIコードをユーザーセッションで実行されるエージェントに移行することを検討することが重要です。
ここでの問題は、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();
}
}
Iあなたが必要と思うNotifyIcon.ShowBalloonTip
あなたのサービスで実装する方法。 thisを読む必要があります。
私が見つけた別の興味深いリンク。してください見てくださいhttp://social.msdn.microsoft.com/Forums/da-DK/winforms/thread/2ceda452-1576-4372-8406-a463333800f7 –
私は実際にはしたいが、私はウィンドウサービスと思う右ですセキュリティ上の問題のデスクトップコーズと対話できません。ここに参考です。 [リンク](http://msdn.microsoft.com/en-us/windows/hardware/gg463353.aspx) –
その後、NotifyIconに行ったり、2つのプロジェクトを作成したりしないでください。Windowsアプリケーションと実際のサービス。 Window Appはサービスとの限定されたやりとりを行い、主にNotifyIconを表示します。 –