समस्या यह है कि एक विंडोज सेवा पृष्ठभूमि में चलता है और इसका उपयोगकर्ता के डेस्कटॉप पर कोई प्रभाव नहीं पड़ता है।
आप (विंडोज़ प्रपत्र) के बिना इस के समान एक आवेदन बना सकते हैं: Notify Icon control in .Net 2.0
और फिर आवेदन में निम्नलिखित वर्ग की तरह कुछ का उपयोग खिड़कियों सेवा के साथ संवाद करने:
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();
}
}
स्रोत
2012-10-12 10:47:54
मुझे मिला एक और दिलचस्प लिंक। कृपया एक नज़र डालें http://social.msdn.microsoft.com/Forums/da-DK/winforms/thread/2ceda452-1576-4372-8406-a463333800f7 –
आप सही हैं मैं वास्तव में ऐसा करना चाहता हूं लेकिन मुझे लगता है कि विंडो सेवा सुरक्षा मुद्दों के डेस्कटॉप coz के साथ बातचीत नहीं कर सकते हैं। यहां संदर्भ है। [लिंक] (http://msdn.microsoft.com/en-us/windows/hardware/gg463353.aspx) –
फिर या तो आपको NotifyIcon के लिए नहीं जाना चाहिए या दो प्रोजेक्ट्स नहीं बनाना चाहिए। एक विंडोज ऐप और आपकी वास्तविक सेवा। विंडो ऐप सेवा के साथ सीमित बातचीत करेगा और मुख्य रूप से यह NotifyIcon दिखाएगा। –