2009-05-11 15 views
20

क्या किसी ईवेंट के लिए पंजीकरण करने का कोई तरीका है जो किसी विशेष फ़ाइल नाम के निष्पादन योग्य होने पर आग लगती है? मुझे पता है कि जब प्रक्रिया समाप्त हो जाती है, प्रक्रिया को संभालकर और बाहर निकलने के लिए पंजीकरण करके एक घटना प्राप्त करने में काफी आसान होता है। लेकिन जब आप किसी प्रक्रिया को पहले से नहीं चल रहे हैं, तो आपको कैसे सूचित किया जा सकता है, शुरू होता है ... सभी चल रही प्रक्रियाओं को मतदान किए बिना?प्रक्रिया निष्पादन योग्य प्रारंभ के लिए .NET ईवेंट

उत्तर

30

आप निम्न का उपयोग कर सकते:

private ManagementEventWatcher WatchForProcessStart(string processName) 
    { 
     string queryString = 
      "SELECT TargetInstance" + 
      " FROM __InstanceCreationEvent " + 
      "WITHIN 10 " + 
      " WHERE TargetInstance ISA 'Win32_Process' " + 
      " AND TargetInstance.Name = '" + processName + "'"; 

     // The dot in the scope means use the current machine 
     string scope = @"\\.\root\CIMV2"; 

     // Create a watcher and listen for events 
     ManagementEventWatcher watcher = new ManagementEventWatcher(scope, queryString); 
     watcher.EventArrived += ProcessStarted; 
     watcher.Start(); 
     return watcher; 
    } 

    private ManagementEventWatcher WatchForProcessEnd(string processName) 
    { 
     string queryString = 
      "SELECT TargetInstance" + 
      " FROM __InstanceDeletionEvent " + 
      "WITHIN 10 " + 
      " WHERE TargetInstance ISA 'Win32_Process' " + 
      " AND TargetInstance.Name = '" + processName + "'"; 

     // The dot in the scope means use the current machine 
     string scope = @"\\.\root\CIMV2"; 

     // Create a watcher and listen for events 
     ManagementEventWatcher watcher = new ManagementEventWatcher(scope, queryString); 
     watcher.EventArrived += ProcessEnded; 
     watcher.Start(); 
     return watcher; 
    } 

    private void ProcessEnded(object sender, EventArrivedEventArgs e) 
    { 
     ManagementBaseObject targetInstance = (ManagementBaseObject) e.NewEvent.Properties["TargetInstance"].Value; 
     string processName = targetInstance.Properties["Name"].Value.ToString(); 
     Console.WriteLine(String.Format("{0} process ended", processName)); 
    } 

    private void ProcessStarted(object sender, EventArrivedEventArgs e) 
    { 
     ManagementBaseObject targetInstance = (ManagementBaseObject)e.NewEvent.Properties["TargetInstance"].Value; 
     string processName = targetInstance.Properties["Name"].Value.ToString(); 
     Console.WriteLine(String.Format("{0} process started", processName)); 
    } 

फिर आप (उदाहरण के लिए "notepad.exe") आपके प्रक्रिया नाम पर गुजर या तो WatchForProcessStart और/या WatchForProcessEnd कहेंगे।

प्रबंधनवेन्ट वाटर ऑब्जेक्ट दो घड़ी * विधियों से वापस लौटाया गया है क्योंकि यह आईडीस्पोज़ेबल लागू करता है और इसलिए जब आप मुद्दों को रोकने के लिए उनके साथ समाप्त कर चुके हैं तो इन वस्तुओं पर निपटान करना चाहिए।

यदि प्रक्रिया शुरू होने के बाद आपको घटना को और अधिक तेज़ी से उठाने की आवश्यकता है तो आप प्रश्नों में मतदान मूल्य भी बदल सकते हैं। ऐसा करने के लिए 10 से कम कुछ के अंदर "10 के अंदर" लाइन को बदलने के लिए

+0

इस कोड को दोबारा प्रतिक्रिया दी जा सकती है, लेकिन मैंने इसे – Clive

+1

समझने में सहायता करने के लिए वर्बोज़ छोड़ा है अब यह एक जवाब है! धन्यवाद! –

+0

वास्तव में यह कोड अच्छी तरह से दिखता है। लेकिन यह मेरे लिए काम नहीं करता है। मुझे कोई बात याद आ रही है? win7, नेट 2.o परियोजना। – Yaya

3

डब्ल्यूएमआई प्रक्रियाओं के निर्माण के दौरान ईवेंट बना सकता है। फिर आप इन घटनाओं को फ़िल्टर कर सकते हैं।

+1

एक उदाहरण अच्छा होगा :) –

+0

@Adam: मैं उस टिप्पणी की अपेक्षा कर रहा था। दुर्भाग्य से यह कुछ समय हो गया है क्योंकि मैंने डब्लूएमआई कार्यक्रमों (वर्षों) के साथ काम किया था, न कि .NET के साथ। इसलिए मुझे यह सीखना होगा कि इसे कैसे करना है ... और इस समय समय नहीं है। – Richard

1

यहां कोड है।

ध्यान दें कि आपको इस कोड को निष्पादित करने के लिए व्यवस्थापक जैसे विजुअल स्टूडियो को प्रारंभ करना होगा।

using System; 
using System.Management; 

namespace AppLaunchDetector 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     {   
      ManagementEventWatcher w = null; 
      WqlEventQuery q; 
      try 
      { 
       q = new WqlEventQuery(); 
       q.EventClassName = "Win32_ProcessStartTrace"; 
       w = new ManagementEventWatcher(q); 
       w.EventArrived += new EventArrivedEventHandler(ProcessStartEventArrived); 
       w.Start(); 
       Console.ReadLine(); // block main thread for test purposes 
      } 
      catch (Exception ex) 
      { 

      } 
      finally 
      { 
       w.Stop(); 
      } 
     } 

     static void ProcessStartEventArrived(object sender, EventArrivedEventArgs e) 
     { 
      foreach (PropertyData pd in e.NewEvent.Properties) 
      { 
       Console.WriteLine("\n============================= ========="); 
       Console.WriteLine("{0},{1},{2}", pd.Name, pd.Type, pd.Value); 
      } 
     } 
    } 
} 
संबंधित मुद्दे