2009-06-09 5 views
17

मेरे पास कुछ ऐसी सेवाएं हैं जिनके लिए कुछ ऐप की सुविधाओं को काम करने के लिए एप्लिकेशन को चलाने की आवश्यकता है। मैं एप्लिकेशन को लॉन्च करने के बाद प्रारंभ करने के लिए केवल बाहरी विंडोज सेवाओं को शुरू करने का विकल्प सक्षम करना चाहता हूं। (जैसा कि उन्हें मशीन के साथ स्वचालित रूप से प्रारंभ करने और एप्लिकेशन की आवश्यकता होने पर स्मृति लेना है)मॉनिटर लॉन्च होने पर मॉनीटर करें

मुझे इसे लागू करने के लिए exe के कोड तक पहुंच नहीं है, इसलिए आदर्श रूप से मैं एक सी # नेट लिखना चाहता हूं विंडोज सेवा जो एक्सई लॉन्च होने पर निगरानी रखेगी।

जो मैंने अभी तक पाया है वह System.IO.FileSystemEventHandler है। यह घटक केवल ईवेंट प्रकारों को बदलता है, बनाया, हटाया जाता है, और नाम बदलता है। मुझे उम्मीद नहीं है कि मैं जो खोज रहा हूं उसे ढूंढने के लिए एक फाइल सिस्टम घटक आदर्श स्थान होगा, लेकिन यह नहीं पता कि कहीं और जाना है।

शायद मैं सही कीवर्ड खोज नहीं रहा हूं, लेकिन मुझे अभी तक Google पर या stackoverflow.com पर कुछ भी उपयोगी नहीं मिला है।

समाधान किसी भी संकेत दिए गए के लिए पहले से एक्सपी, विस्टा, और 7 विन पर चलने के लिए जब यह आता है ...

धन्यवाद की आवश्यकता होगी।

उत्तर

26

this article से, आप प्रक्रिया शुरू करने की घटनाओं को देखने के लिए अपनी सेवा में WMI (System.Management नेमस्पेस) का उपयोग कर सकते हैं।

void WaitForProcess() 
{ 
    ManagementEventWatcher startWatch = new ManagementEventWatcher(
     new WqlEventQuery("SELECT * FROM Win32_ProcessStartTrace")); 
    startWatch.EventArrived 
         += new EventArrivedEventHandler(startWatch_EventArrived); 
    startWatch.Start(); 

    ManagementEventWatcher stopWatch = new ManagementEventWatcher(
     new WqlEventQuery("SELECT * FROM Win32_ProcessStopTrace")); 
    stopWatch.EventArrived 
         += new EventArrivedEventHandler(stopWatch_EventArrived); 
    stopWatch.Start(); 
} 

    static void stopWatch_EventArrived(object sender, EventArrivedEventArgs e) { 
    stopWatch.Stop(); 
    Console.WriteLine("Process stopped: {0}" 
         , e.NewEvent.Properties["ProcessName"].Value); 
    } 

    static void startWatch_EventArrived(object sender, EventArrivedEventArgs e) { 
    startWatch.Stop(); 
    Console.WriteLine("Process started: {0}" 
         , e.NewEvent.Properties["ProcessName"].Value); 
    } 
} 

डब्ल्यूएमआई काफी परिष्कृत प्रश्नों की अनुमति देता है; आप अपने इवेंट हैंडलर को तभी ट्रिगर करने के लिए यहां प्रश्नों को संशोधित कर सकते हैं जब आपका देखा ऐप लॉन्च हो या अन्य मानदंडों पर। एक सी # परिप्रेक्ष्य से Here's a quick introduction

+0

उत्कृष्ट उत्तर। मेरी समस्या हल हो गई। – Stimul8d

+0

उत्कृष्ट, बहुत उपयोगी। चीयर्स! – tjjjohnson

+1

विंडोज 7 पर इस कोड को निष्पादित करने में कुछ परेशानी होने के बाद मुझे startWatch.Start() को कॉल करते समय "पहुंच से वंचित" त्रुटि मिलती है। क्या किसी के लिए कोई कामकाज मिला है? – tjjjohnson

4

तुम यहाँ 3 विकल्प हैं:

विश्वसनीय/घुसपैठ एक, अप्रबंधित कोड में एक हुक जब भी कोई एप्लिकेशन शुरू की है कि अपने सी # ऐप्लिकेशन पर लगातार वापस संचार की स्थापना की। यह सही होना मुश्किल है और प्रत्येक प्रक्रिया के साथ एक अतिरिक्त डीएलएल लोड करना शामिल है। (वैकल्पिक रूप से आप एक ड्राइवर स्थापित कर सकते हैं, जो लिखना मुश्किल है)

कम विश्वसनीय तरीका, सभी प्रक्रियाओं को सूचीबद्ध करें (System.Diagnostics.Process कक्षा का उपयोग करके) नियमित आधार पर (प्रत्येक 10-30 सेकेंड कहें) यह देखने के लिए कि क्या ऐप लॉन्च किया गया है।

प्रबंधित कोड से Win32_Process, InstanceCreationEvent WMI ईवेंट देखना भी संभव हो सकता है। यह सुनिश्चित नहीं है कि यह कितना विश्वसनीय है, लेकिन मुझे संदेह है कि यह मतदान प्रक्रियाओं से बेहतर होगा।

0

अगर प्रक्रिया चल रही है तो निगरानी करें - हालांकि एक सेवा यह करने के लिए चलनी चाहिए।

यदि आप वास्तव में किसी भी संसाधन का उपभोग नहीं करना चाहते हैं - सादा सी में एक साधारण सेवा लिखें। एमएफसी/एटीएल के बिना लिखित सेवा आवेदन 300-400 केबी मेमोरी और वायरसली से कोई CPU चक्र नहीं हो सकता है। जब आप जिस प्रक्रिया में रूचि रखते हैं, तो आप अपनी सी # सेवाओं को जन्म दे सकते हैं।

0
public Process IsProcessOpen(string name) 
     { 
      foreach (Process clsProcess in Process.GetProcesses()) 
       if (clsProcess.ProcessName.Contains(name)) 
        return clsProcess; 
      return null; 
     } 
0

विंडोज 7 पहलू के जवाब में यह काम नहीं कर रहा है। यदि आप 64 बिट प्रक्रियाओं की निगरानी कर रहे हैं तो आपकी प्रक्रिया को 64 बिट एड्रेस स्पेस में काम करने के लिए भी बनाया जाना चाहिए।