我现在遇到了一个难题,怎样利用WMI获取一个进程或线程所占用的CPU及内存信息等?或许有专门的API可以做到这些?找了几天都没找到,急死了!
谢谢各位了!

解决方案 »

  1.   

    如果利用C#获取系统有关环境和属性,这个也是在网上问得比较多的问题,不过大部分只有提问没有回答,最近正好想做有关方面的东西,整理了一下,提供给大家,希望能给大家提供参考意见:首先需要定义几个结构(struct) ,便于DllImport作为返回参数调用。以下是代码:
    CpuInfo.csusing System;
    using System.Configuration;
    using System.Runtime.InteropServices;/**//**
    * LayoutKind.Automatic:为了提高效率允许运行态对类型成员重新排序
    * 注意:永远不要使用这个选项来调用不受管辖的动态链接库函数。
    * LayoutKind.Explicit:对每个域按照FieldOffset属性对类型成员排序
    * LayoutKind.Sequential:对出现在受管辖类型定义地方的不受管辖内存中的类型成员进行排序。
    *//**//// <summary>
    /// 定义CPU的信息结构
    /// </summary>
    [StructLayout(LayoutKind.Sequential)] 
    public struct CpuInfo
    ...{
         /**//// <summary>
         /// OEM ID
         /// </summary>
         public uint dwOemId;
         /**//// <summary>
         /// 页面大小
         /// </summary>
         public uint dwPageSize;
         public uint lpMinimumApplicationAddress;
         public uint lpMaximumApplicationAddress;
         public uint dwActiveProcessorMask;
         /**//// <summary>
         /// CPU个数
         /// </summary>
         public uint dwNumberOfProcessors;
         /**//// <summary>
         /// CPU类型
         /// </summary>
         public uint dwProcessorType;
         public uint dwAllocationGranularity;
         /**//// <summary>
         /// CPU等级
         /// </summary>
         public uint dwProcessorLevel;
         public uint dwProcessorRevision; 
    }
    MemoryInfo.cs
    using System;
    using System.Configuration;
    using System.Runtime.InteropServices;/**//**
    * LayoutKind.Automatic:为了提高效率允许运行态对类型成员重新排序
    * 注意:永远不要使用这个选项来调用不受管辖的动态链接库函数。
    * LayoutKind.Explicit:对每个域按照FieldOffset属性对类型成员排序
    * LayoutKind.Sequential:对出现在受管辖类型定义地方的不受管辖内存中的类型成员进行排序。
    */
    /**//// <summary>
    /// 定义内存的信息结构
    /// </summary>
    [StructLayout(LayoutKind.Sequential)]
    public struct MemoryInfo
    ...{
         /**//// <summary>
         /// 
         /// </summary>
         public uint dwLength;
         /**//// <summary>
         /// 已经使用的内存
         /// </summary>
         public uint dwMemoryLoad;
         /**//// <summary>
         /// 总物理内存大小
         /// </summary>
         public uint dwTotalPhys;
         /**//// <summary>
         /// 可用物理内存大小
         /// </summary>
         public uint dwAvailPhys;
         /**//// <summary>
         /// 交换文件总大小
         /// </summary>
         public uint dwTotalPageFile;
         /**//// <summary>
         /// 可用交换文件大小
         /// </summary>
         public uint dwAvailPageFile;
         /**//// <summary>
         /// 总虚拟内存大小
         /// </summary>
         public uint dwTotalVirtual;
         /**//// <summary>
         /// 可用虚拟内存大小
         /// </summary>
         public uint dwAvailVirtual;
    }SystemTimeInfo.cs
    using System;
    using System.Configuration;
    using System.Runtime.InteropServices;/**//**
    * LayoutKind.Automatic:为了提高效率允许运行态对类型成员重新排序
    * 注意:永远不要使用这个选项来调用不受管辖的动态链接库函数。
    * LayoutKind.Explicit:对每个域按照FieldOffset属性对类型成员排序
    * LayoutKind.Sequential:对出现在受管辖类型定义地方的不受管辖内存中的类型成员进行排序。
    */
    /**//// <summary>
    /// 定义系统时间的信息结构
    /// </summary>
    [StructLayout(LayoutKind.Sequential)] 
    public struct SystemTimeInfo
    ...{
         /**//// <summary>
         /// 年
         /// </summary>
         public ushort wYear;
         /**//// <summary>
         /// 月
         /// </summary>
         public ushort wMonth;
         /**//// <summary>
         /// 星期
         /// </summary>
         public ushort wDayOfWeek;
         /**//// <summary>
         /// 天
         /// </summary>
         public ushort wDay;
         /**//// <summary>
         /// 小时
         /// </summary>
         public ushort wHour;
         /**//// <summary>
         /// 分钟
         /// </summary>
         public ushort wMinute;
         /**//// <summary>
         /// 秒
         /// </summary>
         public ushort wSecond;
         /**//// <summary>
         /// 毫秒
         /// </summary>
         public ushort wMilliseconds;
    }
    另外还定义了一个调用类SystemInfo.cs,代码如下:
    using System;
    using System.Configuration;
    using System.Runtime.InteropServices;
    using System.Management;
    using System.Text;/**//// <summary>
    /// SystemInfo 的摘要说明
    /// </summary>
    public class SystemInfo
    ...{
         private const int CHAR_COUNT = 128;
         public SystemInfo()
         ...{
            
         }
         [DllImport("kernel32")]
         private static extern void GetWindowsDirectory(StringBuilder WinDir, int count);     [DllImport("kernel32")]
         private static extern void GetSystemDirectory(StringBuilder SysDir, int count);     [DllImport("kernel32")]
         private static extern void GetSystemInfo(ref CpuInfo cpuInfo);     [DllImport("kernel32")]
         private static extern void GlobalMemoryStatus(ref MemoryInfo memInfo);     [DllImport("kernel32")]
         private static extern void GetSystemTime(ref SystemTimeInfo sysInfo);     /**//// <summary>
         /// 查询CPU编号
         /// </summary>
         /// <returns></returns>
      

  2.   

    public string GetCpuId()
         ...{
             ManagementClass mClass = new ManagementClass("Win32_Processor");
             ManagementObjectCollection moc = mClass.GetInstances();
             string cpuId=null;
             foreach (ManagementObject mo in moc)
             ...{
                 cpuId = mo.Properties["ProcessorId"].Value.ToString();
                 break;
             }
             return cpuId;
         }     /**//// <summary>
         /// 查询硬盘编号
         /// </summary>
         /// <returns></returns>
         public string GetMainHardDiskId()
         ...{
             ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia");
             String hardDiskID=null;
             foreach (ManagementObject mo in searcher.Get())
             ...{
                 hardDiskID = mo["SerialNumber"].ToString().Trim();
                 break;
             }
             return hardDiskID; 
         }     /**//// <summary>
         /// 获取Windows目录
         /// </summary>
         /// <returns></returns>
         public string GetWinDirectory()
         ...{
             StringBuilder sBuilder = new StringBuilder(CHAR_COUNT);
             GetWindowsDirectory(sBuilder, CHAR_COUNT);
             return sBuilder.ToString();
         }     /**//// <summary>
         /// 获取系统目录
         /// </summary>
         /// <returns></returns>
         public string GetSysDirectory()
         ...{
             StringBuilder sBuilder = new StringBuilder(CHAR_COUNT);
             GetSystemDirectory(sBuilder, CHAR_COUNT);
             return sBuilder.ToString();
         }    /**//// <summary>
        /// 获取CPU信息
        /// </summary>
        /// <returns></returns>
         public CpuInfo GetCpuInfo()
         ...{
             CpuInfo cpuInfo = new CpuInfo();
             GetSystemInfo(ref cpuInfo);
             return cpuInfo;
         }     /**//// <summary>
         /// 获取系统内存信息
         /// </summary>
         /// <returns></returns>
         public MemoryInfo GetMemoryInfo()
         ...{
             MemoryInfo memoryInfo = new MemoryInfo();
             GlobalMemoryStatus(ref memoryInfo);
             return memoryInfo;
         }     /**//// <summary>
         /// 获取系统时间信息
         /// </summary>
         /// <returns></returns>
         public SystemTimeInfo GetSystemTimeInfo()
         ...{
             SystemTimeInfo systemTimeInfo = new SystemTimeInfo();
             GetSystemTime(ref systemTimeInfo);
             return systemTimeInfo;
         }     /**//// <summary>
         /// 获取系统名称
         /// </summary>
         /// <returns></returns>
         public string GetOperationSystemInName()
         ...{
             OperatingSystem os = System.Environment.OSVersion;
             string osName = "UNKNOWN";
             switch (os.Platform)
             ...{
                 case PlatformID.Win32Windows:
                     switch (os.Version.Minor)
                     ...{
                         case 0: osName = "Windows 95"; break;
                         case 10: osName = "Windows 98"; break;
                         case 90: osName = "Windows ME"; break;
                     }
                     break;
                 case PlatformID.Win32NT:
                     switch (os.Version.Major)
                     ...{
                         case 3: osName = "Windws NT 3.51"; break;
                         case 4: osName = "Windows NT 4"; break;
                         case 5: if (os.Version.Minor == 0)
                             ...{
                                 osName = "Windows 2000"; 
                             }
                             else if (os.Version.Minor == 1)
                             ...{
                                 osName = "Windows XP"; 
                             }
                             else if (os.Version.Minor == 2)
                             ...{
                                 osName = "Windows Server 2003"; 
                             }
                             break;
                         case 6: osName = "Longhorn"; break;
                     }
                     break;
             }
             return String.Format("{0},{1}", osName, os.Version.ToString());
         }
    }
    以下是调用实例,为了简单,我在一个aspx页面中输出,不过这个程序可以在WinForm中调用:
    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Collections.Specialized;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.Runtime.InteropServices;public partial class Index : System.Web.UI.Page
    ...{
         protected void Page_Load(object sender, EventArgs e)
         ...{
             if (!Page.IsPostBack)
             ...{
                 SystemInfo systemInfo = new SystemInfo();
                  Response.Write("操作系统:" + systemInfo.GetOperationSystemInName() + "<br/>");
                 Response.Write("CPU编号:"+systemInfo.GetCpuId() + "<br/>");
                 Response.Write("硬盘编号:"+systemInfo.GetMainHardDiskId() + "<br/>");
                 Response.Write("Windows目录所在位置:" + systemInfo.GetSysDirectory() + "<br/>");
                 Response.Write("系统目录所在位置:" + systemInfo.GetWinDirectory() + "<br/>");
                 MemoryInfo memoryInfo = systemInfo.GetMemoryInfo();
                 CpuInfo cpuInfo = systemInfo.GetCpuInfo();
                 Response.Write("dwActiveProcessorMask" + cpuInfo.dwActiveProcessorMask + "<br/>");
                 Response.Write("dwAllocationGranularity" + cpuInfo.dwAllocationGranularity + "<br/>");
                 Response.Write("CPU个数:" + cpuInfo.dwNumberOfProcessors + "<br/>");
                 Response.Write("OEM ID:" + cpuInfo.dwOemId + "<br/>");
                 Response.Write("页面大小" + cpuInfo.dwPageSize + "<br/>");
                 Response.Write("CPU等级" + cpuInfo.dwProcessorLevel + "<br/>");
                 Response.Write("dwProcessorRevision" + cpuInfo.dwProcessorRevision + "<br/>");
                 Response.Write("CPU类型" + cpuInfo.dwProcessorType + "<br/>");
                 Response.Write("lpMaximumApplicationAddress" + cpuInfo.lpMaximumApplicationAddress + "<br/>");
                 Response.Write("lpMinimumApplicationAddress" + cpuInfo.lpMinimumApplicationAddress + "<br/>");
                 Response.Write("CPU类型:" + cpuInfo.dwProcessorType + "<br/>");
                 Response.Write("可用交换文件大小:" + memoryInfo.dwAvailPageFile + "<br/>");
                 Response.Write("可用物理内存大小:" + memoryInfo.dwAvailPhys + "<br/>");
                 Response.Write("可用虚拟内存大小" + memoryInfo.dwAvailVirtual + "<br/>");
                 Response.Write("操作系统位数:" + memoryInfo.dwLength + "<br/>");
                 Response.Write("已经使用内存大小:" + memoryInfo.dwMemoryLoad + "<br/>");
                 Response.Write("交换文件总大小:" + memoryInfo.dwTotalPageFile + "<br/>");
                 Response.Write("总物理内存大小:" + memoryInfo.dwTotalPhys + "<br/>");
                 Response.Write("总虚拟内存大小:" + memoryInfo.dwTotalVirtual + "<br/>");
             }
         }
    }
    说明:前台aspx页面没有任何控件。