2012-10-12 13 views
13

मैंने जीत सेवा प्रोग्राम विकसित किया है जो मेरे स्थानीय ड्राइव से एक्सेल फ़ाइल पढ़ता है और फिर इस फ़ाइल मान को डेटाबेस में सहेजता है और अब मैं एक सूचना आइकन विकसित करना चाहता हूं जो एक संदेश दिखाने के लिए प्रदर्शित होगा (" एक्सेल फ़ाइल डेटाबेस में सहेजी गई ") मेरी सेवा शुरू होने के बाद और एक्सेल फ़ाइल को डेटाबेस में सहेज लेगी।विंडो सेवा के लिए आइकन सूचित करें

कृपया इसे हल करने के लिए मुझे कुछ संकेत दें।

उत्तर

13

Vista से आगे, आपकी सेवा को डेस्कटॉप से ​​बातचीत करने की अनुमति नहीं दी जाएगी, इसलिए सेवा से सीधे यूआई रनिंग नहीं हो सकता है। आपको एक एजेंट एप्लिकेशन बनाना होगा जो उपयोगकर्ता लॉगिन पर शुरू होता है जो आपकी सेवा से चैट कर सकता है (शायद डब्ल्यूसीएफ का उपयोग कर)।

यहाँ MS have to say ऐसा करने के बारे में बताया गया है:

अधिक जटिल बातचीत के लिए, डेवलपर्स एक एजेंट उस उपयोगकर्ता के सत्र में चलाता है और सभी यूआई आवश्यकताओं संभालती में अपने यूआई कोड बढ़ना चाहिए। एजेंट आरपीसी या नामित पाइप के माध्यम से सेवा के साथ संचार करता है। यदि उपयोगकर्ता नियंत्रण कक्ष, इंटरनेट एक्सप्लोरर, या इसी तरह के यूआई अनुभव का उपयोग करके यूआई इंटरैक्शन शुरू करता है, तो यूआई अनुभव एजेंट को शुरू करना चाहिए। एजेंट तब सभी यूआई इंटरैक्शन को संभालता है। यदि यूआई की आवश्यकता है लेकिन उपयोगकर्ता द्वारा शुरू नहीं किया गया है, तो सेवा को यूआई को लॉन्च करने का प्रयास करने के बजाय एजेंट को किसी आवश्यक यूआई को शुरू करने का अनुरोध करना होगा। दुर्लभ परिस्थिति में जहां सेवा को उपयोगकर्ता इंटरैक्शन शुरू करना होगा और एजेंट पहले से नहीं चल रहा है, सेवा को एजेंट शुरू करने के लिए CreateProcessAsUser API को कॉल करना चाहिए। एजेंट तब सभी यूआई इंटरैक्शन शुरू कर सकता है। डेवलपर्स के लिए सभी संभावित उपयोग परिदृश्यों की सावधानीपूर्वक समीक्षा करना महत्वपूर्ण है और उपयोगकर्ता सत्र में चलने वाले एजेंट में सभी यूआई कोड को स्थानांतरित करने पर विचार करें।

2

समस्या यह है कि एक विंडोज सेवा पृष्ठभूमि में चलता है और इसका उपयोगकर्ता के डेस्कटॉप पर कोई प्रभाव नहीं पड़ता है।

आप (विंडोज़ प्रपत्र) के बिना इस के समान एक आवेदन बना सकते हैं: 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(); 
    } 
} 
1

मैं आपको लगता है कि आपको NotifyIcon.ShowBalloonTip आपकी सेवा में लागू करने की विधि चाहिए। आपको this पढ़ने की आवश्यकता हो सकती है।

+0

मुझे मिला एक और दिलचस्प लिंक। कृपया एक नज़र डालें http://social.msdn.microsoft.com/Forums/da-DK/winforms/thread/2ceda452-1576-4372-8406-a463333800f7 –

+0

आप सही हैं मैं वास्तव में ऐसा करना चाहता हूं लेकिन मुझे लगता है कि विंडो सेवा सुरक्षा मुद्दों के डेस्कटॉप coz के साथ बातचीत नहीं कर सकते हैं। यहां संदर्भ है। [लिंक] (http://msdn.microsoft.com/en-us/windows/hardware/gg463353.aspx) –

+0

फिर या तो आपको NotifyIcon के लिए नहीं जाना चाहिए या दो प्रोजेक्ट्स नहीं बनाना चाहिए। एक विंडोज ऐप और आपकी वास्तविक सेवा। विंडो ऐप सेवा के साथ सीमित बातचीत करेगा और मुख्य रूप से यह NotifyIcon दिखाएगा। –

संबंधित मुद्दे