2009-02-04 11 views
9

हम एक छोटा सा एप्लीकेशन विकसित करने की कोशिश कर रहे हैं जो विंडोज मशीन में निष्पादित प्रोग्राम/प्रक्रियाओं की निगरानी कर सकता है।विंडोज़ में प्रक्रिया/प्रोग्राम निष्पादन की निगरानी कैसे करें?

यदि प्रोग्राम/प्रक्रिया को चलाने की आवश्यकता नहीं है, तो इसे अवरुद्ध किया जाना चाहिए। यह एंटीवायरस के समान काम करता है।

यह मूल विचार है।

मैं मशीन में चलाने की कोशिश कर रहे प्रत्येक कार्यक्रम/प्रक्रिया के बारे में अधिसूचित होने के लिए ओएस में हुक करने के तरीकों को जानना चाहता हूं।

उत्तर

9

सबसे आसान तरीका है WMI उपयोग करने के लिए है। विशेष रूप से Win32_ProcessStartTrace की निगरानी करें। यह Win32_Process से बेहतर है, क्योंकि यह ईवेंट का उपयोग करने के लिए सेटअप है जबकि Win32_Process को मतदान की आवश्यकता होती है जो अधिक CPU गहन है। नीचे सी # में यह कैसे करना है। सबसे पहले सुनिश्चित करें कि सिस्टम। प्रबंधन आपके प्रोजेक्ट के संदर्भ के रूप में स्थापित है।

public System.Management.ManagementEventWatcher mgmtWtch; 

    public Form1() 
    { 
     InitializeComponent(); 
     mgmtWtch = new System.Management.ManagementEventWatcher("Select * From Win32_ProcessStartTrace"); 
     mgmtWtch.EventArrived += new System.Management.EventArrivedEventHandler(mgmtWtch_EventArrived); 
     mgmtWtch.Start(); 
    } 

    void mgmtWtch_EventArrived(object sender, System.Management.EventArrivedEventArgs e) 
    { 
     MessageBox.Show((string)e.NewEvent["ProcessName"]); 
    } 

    private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     mgmtWtch.Stop(); 
    } 

कोड हर बार एक नई प्रक्रिया लॉन्च करने पर एक संदेशबॉक्स उत्पन्न करेगा। वहां से आप श्वेतसूची/ब्लैकलिस्ट की जांच कर सकते हैं और उचित तरीके से कार्य कर सकते हैं।

+1

दुर्भाग्य से WMI प्रक्रिया के निर्माण के 5 सेकंड बाद अधिसूचनाएं वितरित करने लगती है। रीयल-टाइम नोटिफिकेशन के लिए उपयोगी नहीं है या अल्पकालिक कार्यों के साथ कुछ भी कर रहा है। –

+1

मुझे उसी कार्य के लिए माइक्रोसॉफ्ट की वेबसाइट पर एक उदाहरण मिला [यहां] (http://msdn.microsoft.com/en-us/library/system.management.managementeventwatcher.waitfornextevent.aspx?cs-save-lang=1&cs- lang = csharp # कोड-स्निपेट -1), लेकिन यह एक ही समस्या है। –

+0

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

0

मैंने रीयल-टाइम अधिसूचना प्राप्त करने का प्रयास नहीं किया है। समय प्रक्रिया शुरू कर दी

  • TotalProcessorTime शो - - दिखाता है कि कैसे कभी, यहाँ कैसे सी # में चल रही प्रक्रियाओं

    using System.Diagnostics; 
    
    //Somewhere in your method 
    
    Process[] runningList = Process.GetProcesses(); 
    
    foreach(Process p in runningList){ 
    Console.WriteLine("Process: {0} ID: {1}", p.ProcessName, p.Id); 
    } 
    

    तुम भी एक प्रक्रिया के निम्नलिखित रंगमंच की सामग्री का उपयोग कर सकते

    • StartTime प्राप्त करने के लिए है प्रक्रिया के सीपीयू समय की मात्रा
    • थ्रेड - प्रक्रिया में धागे के संग्रह तक पहुंच प्रदान करता है
  • 0

    मैं Win32-api SetWindowsHookEx को निरंतर WH_GETMESSAGE के साथ एक नई विंडो बनाने के दौरान अपने प्रोग्राम में कॉलबैक जोड़ने के लिए जांचूँगा।

    http://pinvoke.net/default.aspx/user32.SetWindowsHookEx

    गूगल कि एपीआई और WH_GETMESSAGE बाहर अधिक जानकारी प्राप्त करने के लिए।

    इसके अलावा बाहर की जाँच निम्न लेख/कोड librarys: http://www.vbaccelerator.com/home/Vb/Code/Libraries/Hooks/vbAccelerator_Hook_Library/article.asp

    http://www.codeproject.com/KB/DLL/hooks.aspx?fid=2061&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=76&select=726975

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