`

如何使用WMI获取进程信息(异步处理)

阅读更多

以下示例演示如何使用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();

}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics