zoukankan      html  css  js  c++  java
  • .NET基础示例系列之八:WMI获取进程信息

    最近发现一个比较有趣的东西,WMI

    MSDNWindows Management Instrumentation (WMI) Windows 操作系统的一个组件,允许通过编程方式访问企业环境中的管理信息。

     

    以下示例演示如何使用WMI获得本地机器的进程列表(当然,WMI也能获得远程机器的进程列表,远不只例子中的功能),示例代码是我简化codeproject的例子而来:

     

    //用于表示进程信息的结构

    public struct structProcessInfo

    {

        //进程名

         public string stringName;

        //进程ID

         public string stringProcessID;

        //父进程ID

         public string stringParentProcessID;

        //用户名

         public string stringUserName;

    }

     

    public class ProcessesInfo

    {

         private structProcessInfo _value;

         public structProcessInfo Value

         {

             get {return _value;}

             set {_value = value;}

         }

    }

     

    //用于保存进程信息的字典类,继承于NameObjectCollectionBase

    public class ProcessesDictionary : NameObjectCollectionBase

    {

        public void Clear()

        {

            BaseClear();

        }

     

        public void Add(string name, ProcessesInfo processObj)

        {

            BaseAdd(name, processObj);

        }

     

        public void Remove(string name)

        {

            BaseRemove(name);

        }

     

        public void RemoveAt(int index)

        {

            BaseRemoveAt(index);

        }

     

        public ProcessesInfo this[int index]

        {

            get { return (ProcessesInfo)BaseGet(index); }

            set { BaseSet(index, value); }

        }

     

        public ProcessesInfo this[string name]

        {

            get { return (ProcessesInfo)BaseGet(name); }

            set { BaseSet(name, value); }

        }

    }

     

    =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =

     

    //用于表示进程CPU及内存使用情况的结构

    public struct structPerformance

    {

        public string stringPercentProcessorTime;

        public string stringVirtualBytes;

    }

     

    public class ProcessPerf

    {

        private structPerformance _value;

     

        public structPerformance Value

        {

            get { return _value; }

            set { _value = value; }

        }

    }

     

    //用于保存进程CPU及内存使用情况的字典类

    public class ProcessesPerformanceDictionary : NameObjectCollectionBase

    {

        public void Clear()

        {

            BaseClear();

        }

     

        public void Add(string name, ProcessPerf processPerformance)

        {

            BaseAdd(name, processPerformance);

        }

     

        public void Remove(string name)

        {

            BaseRemove(name);

        }

     

        public void RemoveAt(int index)

        {

            BaseRemoveAt(index);

        }

     

        public ProcessPerf this[int index]

        {

            get { return (ProcessPerf)BaseGet(index); }

            set { BaseSet(index, value); }

        }

     

        public ProcessPerf this[string name]

        {

            get { return (ProcessPerf)BaseGet(name); }

            set { BaseSet(name, value); }

        }

    }

     

    =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =

     

    //表示ManagementObject对象的异步调用方法是否完成

    public class MyHandler

    {

        private bool isComplete = false;

        private ManagementBaseObject returnObject;

     

        public void Done(object sender, ObjectReadyEventArgs e)

        {

            isComplete = true;

            returnObject = e.NewObject;

        }

     

        public bool IsComplete

        {

            get

            {

                return isComplete;

            }

        }

     

        public ManagementBaseObject ReturnObject

        {

            get

            {

                return returnObject;

            }

        }

    }

     

    =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =

     

    一个窗体,添加一个ListViewlvProcess,一个ButtonbtList用于显示进程列表,一个ButtonbtClose用于关闭窗体:

    private void btList_Click(object sender, EventArgs e)

    {

        this.lvProcess.Items.Clear();

     

        ManagementOperationObserver observer = new ManagementOperationObserver();

        MyHandler invokeHandler = new MyHandler();

        observer.ObjectReady += new ObjectReadyEventHandler(invokeHandler.Done);

     

        ProcessesDictionary pDict = new ProcessesDictionary();

        ProcessesPerformanceDictionary perDict = new ProcessesPerformanceDictionary();

     

        ProcessesInfo pInfo;

        structProcessInfo pStruct;

     

        ProcessPerf perInfo;

        structPerformance perStruct;

     

        string[] lvData = new string[5];

     

        #region获取进程名称、ID、父进程ID、进程所属用户名

        ManagementObjectCollection moc = this.ExecSearch("SELECT * FROM Win32_Process");

        if (moc == null)

        {

            MessageBox.Show("Error:null");

            return;

        }

     

        foreach (ManagementObject mo in moc)

        {

            pInfo = new ProcessesInfo();

            pStruct = new structProcessInfo();

            pStruct.stringName = mo["Name"].ToString();

            pStruct.stringProcessID = mo["ProcessID"].ToString();

            pStruct.stringParentProcessID = mo["ParentProcessID"].ToString();

     

            mo.InvokeMethod(observer, "GetOwner", null);

            while (!invokeHandler.IsComplete)

            {

                System.Threading.Thread.Sleep(500);

            }

     

            //判断获取用户名的操作是否成功

            if (invokeHandler.ReturnObject["returnValue"].ToString() == "0")

            {

                pStruct.stringUserName = invokeHandler.ReturnObject.Properties["User"].Value.ToString();

            }

            else

            {

                pStruct.stringUserName = "";

            }

     

            //保存该进程信息到字典类中

            pInfo.Value = pStruct;

            pDict.Add(mo["ProcessID"].ToString(), pInfo);

        }

        #endregion

     

        #region获得进程的CPU及内存使用情况

        ManagementObjectCollection moc1 = this.ExecSearch("SELECT * FROM Win32_PerfFormattedData_PerfProc_Process");

        if (moc1 == null)

        {

            MessageBox.Show("Error:null");

            return;

        }

     

        foreach (ManagementObject mo1 in moc1)

        {

            perInfo = new ProcessPerf();

            perStruct = new structPerformance();

     

            perStruct.stringPercentProcessorTime = mo1.Properties["PercentProcessorTime"].Value.ToString();

            perStruct.stringVirtualBytes = mo1["VirtualBytes"].ToString();

     

            //添加CPU及内存使用情况到字典类中

            perInfo.Value = perStruct;

            perDict.Add(mo1["IDProcess"].ToString(), perInfo);

            perInfo = null;

        }

        #endregion

     

        #region显示列表

        foreach (string stringProcessID in pDict)

        {

            pStruct = pDict[stringProcessID].Value;

            lvData[0] = pStruct.stringName.ToString();

            lvData[4] = pStruct.stringProcessID.ToString();

            lvData[1] = pStruct.stringUserName.ToString();

     

            try

            {

                lvData[2] = perDict[pStruct.stringProcessID.ToString()].Value.stringPercentProcessorTime.ToString();

                lvData[3] = perDict[pStruct.stringProcessID.ToString()].Value.stringVirtualBytes.ToString();

            }

            catch (NullReferenceException)

            {

                //无法获取CPU及内存情况

                lvData[2] = "0";

                lvData[3] = "0";

            }

     

            ListViewItem lvItem = new ListViewItem(lvData, 0);

            lvProcess.Items.Add(lvItem);

        }

        #endregion

     

        pDict.Clear();

        pDict = null;

        perDict.Clear();

        perDict = null;

    }

     

    ///<summary>

    ///执行查询

    ///</summary>

    ///<param name="command">查询语句</param>

    ///<returns></returns>

    private ManagementObjectCollection ExecSearch(string command)

    {

        ManagementObjectCollection moc = null;

        ObjectQuery objQuery = new ObjectQuery(command);

        string stringMachineName = "localhost";

        ManagementScope scope = new ManagementScope("\\\\" + stringMachineName + "\\root\\cimv2");

        ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, objQuery);

     

        try

        {

            moc = searcher.Get();

        }

        catch (Exception x)

        {

            MessageBox.Show("Error:" + x.Message);

        }

     

        return moc;

    }

     

     

    private void btClose_Click(object sender, EventArgs e)

    {

        this.Close();

    }

  • 相关阅读:
    《Machine Learning in Action》—— 白话贝叶斯,“恰瓜群众”应该恰好瓜还是恰坏瓜
    《Machine Learning in Action》—— 女同学问Taoye,KNN应该怎么玩才能通关
    《Machine Learning in Action》—— Taoye给你讲讲决策树到底是支什么“鬼”
    深度学习炼丹术 —— Taoye不讲码德,又水文了,居然写感知器这么简单的内容
    《Machine Learning in Action》—— 浅谈线性回归的那些事
    《Machine Learning in Action》—— 懂的都懂,不懂的也能懂。非线性支持向量机
    《Machine Learning in Action》—— hao朋友,快来玩啊,决策树呦
    《Machine Learning in Action》—— 剖析支持向量机,优化SMO
    《Machine Learning in Action》—— 剖析支持向量机,单手狂撕线性SVM
    JVM 字节码指令
  • 原文地址:https://www.cnblogs.com/morvenhuang/p/513326.html
Copyright © 2011-2022 走看看