C#进程实时监控代码

第一步,新建一个C#控制台应用程序项目WinProcess

 

第二步。建一个 ProcessInfo类

 

1)先添加两个命名空间

using System.Management;
using System.Diagnostics;

2)在引用这边添加引用


 

3)代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Management;
using System.Diagnostics;

namespace WinProcess
{
  public class ProcessInfo
    {
        
        // defenition of the delegates
        public delegate void StartedEventHandler(object sender, EventArgs e);
        public delegate void TerminatedEventHandler(object sender, EventArgs e);

        // events to subscribe
        public StartedEventHandler Started = null;
        public TerminatedEventHandler Terminated = null;

        // WMI event watcher
        private ManagementEventWatcher watcher;
      

        /// <summary>
        /// Construction that binds specific application with event declared
        /// </summary>
        /// <param name="LocalServerName"></param>
        /// <param name="appName"></param>
        public ProcessInfo(string appName)
        {
            // querry every 2 seconds
            string pol = "2";

            string queryString =
                "SELECT *" +
                "  FROM __InstanceOperationEvent " +
                "WITHIN  " + pol +
                " WHERE TargetInstance ISA 'Win32_Process' " +
                "   AND TargetInstance.Name = '" + appName + "'";

            string scope = @"//127.0.0.1/root/CIMV2";

            // create the watcher and start to listen
            watcher = new ManagementEventWatcher(scope, queryString);
            watcher.EventArrived += new EventArrivedEventHandler(this.OnEventArrived);
            watcher.Start();
        }

        /// <summary>
        /// Destruction function
        /// </summary>
        public void Dispose()
        {
            watcher.Stop();
            watcher.Dispose();
        }

        /// <summary>
        /// Get all processes that running in local machine
        /// </summary>
        /// <returns></returns>
        public static DataTable RunningProcesses()
        {
            // The second way of constructing a query
            string queryString =
                "SELECT Name, ProcessId, Caption, ExecutablePath" +
                "  FROM Win32_Process";

            SelectQuery query = new SelectQuery(queryString);
            ManagementScope scope = new ManagementScope(@"//127.0.0.1/root/CIMV2");

            ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
            ManagementObjectCollection processes = searcher.Get();

            DataTable result = new DataTable();
            result.Columns.Add("Name", Type.GetType("System.String"));
            result.Columns.Add("ProcessId", Type.GetType("System.Int32"));
            result.Columns.Add("Caption", Type.GetType("System.String"));
            result.Columns.Add("Path", Type.GetType("System.String"));

            foreach (ManagementObject mo in processes)
            {
                DataRow row = result.NewRow();
                row["Name"] = mo["Name"].ToString();
                row["ProcessId"] = Convert.ToInt32(mo["ProcessId"]);
                if (mo["Caption"] != null)
                    row["Caption"] = mo["Caption"].ToString();
                if (mo["ExecutablePath"] != null)
                    row["Path"] = mo["ExecutablePath"].ToString();
                result.Rows.Add(row);
            }
            return result;
        }

        /// <summary>
        /// Get all processes that running in specific server
        /// </summary>
        /// <param name="sServerName"></param>
        /// <param name="sUserName"></param>
        /// <param name="sPassword"></param>
        /// <returns></returns>
        public static DataTable RunningProcesses(
            string sServerName,
            string sUserName,
            string sPassword)
        {
            // The second way of constructing a query
            string queryString =
                "SELECT Name, ProcessId, Caption, ExecutablePath" +
                "  FROM Win32_Process";

            SelectQuery query = new SelectQuery(queryString);

            //Set connection parameters
            ConnectionOptions options = new ConnectionOptions();
            options.Username = sUserName;
            options.Password = sPassword;

            //Create management scope
            ManagementScope scope = new ManagementScope(
                string.Format(@"//{0}/root/CIMV2", sServerName),
                options);

            //To connect
            try
            {
                scope.Connect();
            }
            catch (Exception err)
            {
                Debug.WriteLine(err.Message);
                return null;
            }
            catch
            {
                return null;
            }

            ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
            ManagementObjectCollection processes = searcher.Get();

            DataTable result = new DataTable();
            result.Columns.Add("Name", Type.GetType("System.String"));
            result.Columns.Add("ProcessId", Type.GetType("System.Int32"));
            result.Columns.Add("Caption", Type.GetType("System.String"));
            result.Columns.Add("Path", Type.GetType("System.String"));

            foreach (ManagementObject mo in processes)
            {
                DataRow row = result.NewRow();
                row["Name"] = mo["Name"].ToString();
                row["ProcessId"] = Convert.ToInt32(mo["ProcessId"]);
                if (mo["Caption"] != null)
                    row["Caption"] = mo["Caption"].ToString();
                if (mo["ExecutablePath"] != null)
                    row["Path"] = mo["ExecutablePath"].ToString();
                result.Rows.Add(row);
            }
            return result;
        }

        /// <summary>
        /// Event handle function
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnEventArrived(object sender, System.Management.EventArrivedEventArgs e)
        {
            try
            {
                string eventName = e.NewEvent.ClassPath.ClassName;
                Debug.WriteLine(eventName);

                if (eventName.CompareTo("__InstanceCreationEvent") == 0)
                {
                    // Started
                    if (Started != null)
                        Started(this, e);
                    
                }
                else if (eventName.CompareTo("__InstanceDeletionEvent") == 0)
                {
                    // Terminated
                    if (Terminated != null)
                        Terminated(this, e);

                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
            }
        }

    }
    
}

第三步,写主函数代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WinProcess
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("请启用QQ应用程序!");
            ProcessInfo notePad = new ProcessInfo("QQ.exe");
            notePad.Started += new ProcessInfo.StartedEventHandler(NotepadStarted);
            notePad.Terminated += new ProcessInfo.TerminatedEventHandler(NotepadTerminated);
            Console.ReadKey();
        }
        static void NotepadStarted(object sender, EventArgs e)
        {
            Console.WriteLine("进程已启动");
        }
        static void NotepadTerminated(object sender, EventArgs e)
        {
            Console.Write("进程已关闭");
            
        }

    }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值