PerformanceCouter里只有AvailableMemory一项可以取得剩下的物理内存数量,但是物理内存的总量要怎么取得?虚拟内存怎么取得?还有交换区呢?
写一个系统使用情况的监视要用到,却发现找不到想要的数据,郁闷……

解决方案 »

  1.   


    using   System.Runtime.InteropServices;     
        
      [DllImport("kernel32")]     
      public   static   extern   void   GlobalMemoryStatus(ref   MEMORY_INFO   meminfo);     
        
      //定义内存的信息结构     
      [StructLayout(LayoutKind.Sequential)]     
      public   struct   MEMORY_INFO     
      {     
      public   uint   dwLength;     
      public   uint   dwMemoryLoad;     
      public   uint   dwTotalPhys;     
      public   uint   dwAvailPhys;     
      public   uint   dwTotalPageFile;     
      public   uint   dwAvailPageFile;     
      public   uint   dwTotalVirtual;     
      public   uint   dwAvailVirtual;     
      }     
        
        
      //调用GlobalMemoryStatus函数获取内存的相关信息     
      MEMORY_INFO   MemInfo;     
      MemInfo   =   new   MEMORY_INFO();     
      GlobalMemoryStatus(ref   MemInfo);     
      MemoryLoad.Text   =   MemInfo.dwMemoryLoad.ToString()+"%的内存正在使用";     
      TotalPhys.Text   =   "物理内存共有"+MemInfo.dwTotalPhys.ToString()+"字节";     
      AvailPhys.Text   =   "可使用的物理内存有"+MemInfo.dwAvailPhys.ToString()+"字节";     
      TotalPageFile.Text   =   "交换文件总大小为"+MemInfo.dwTotalPageFile.ToString()+"字节";     
      AvailPageFile.Text   =   "尚可交换文件大小为"+MemInfo.dwAvailPageFile.ToString()+"字节";     
      TotalVirtual.Text   =   "总虚拟内存有"+MemInfo.dwTotalVirtual.ToString()+"字节";     
      AvailVirtual.Text   =   "未用虚拟内存有"+MemInfo.dwAvailVirtual.ToString()+"字节";     
        
      

  2.   

    用.net的 WMI或者 performance counter.msdn很容易找到
      

  3.   

    又是调用API……
    谢谢末日!
    结贴。
      

  4.   

    ManagementObjectSearcher mos = new ManagementObjectSearcher("select * from Win32_MemoryArray");
                foreach (ManagementObject mo in mos.Get())
                {
                    foreach (PropertyData pd in mo.Properties)
                    {
                        object value = mo.GetPropertyValue(pd.Name);
                        if(value != null)
                            richTextBox1.AppendText(pd.Name + "---" + value + "\n");
                    }
                }