110,538
社区成员
发帖
与我相关
我的任务
分享
//API声明
[DllImport("kernel32.dll", SetLastError = true)]
static extern void GlobalMemoryStatusEx(ref MemoryStatusEx lpBuffer);
//忽略其他细节
MemoryStatusEx mem = new MemoryStatusEx();
mem.DwLength = sizeof(int) * 2 + sizeof(long) * 7;
GlobalMemoryStatusEx(ref mem);
//使用WMI
ManagementScope ms = new ManagementScope();
ms.Connect();
ObjectQuery oq = new ObjectQuery();
oq.QueryString = "SELECT * FROM Win32_PhysicalMemory";
ManagementObjectSearcher sercher = new ManagementObjectSearcher(ms, oq);
ManagementObjectCollection memMoc = sercher.Get();
long capacityTemp = 0;
foreach (ManagementObject mo in memMoc)
{
//内存总量等于所有插槽上内存容量之和
capacityTemp += Convert.ToInt64(mo["Capacity"].ToString());
}
/// <summary>
/// 物理内存大小。
/// </summary>
public static uint PhysicalMemory
{
get
{
if(!_isGetMemoryInfo)
{
memInfo = new MemoryInfo();
GlobalMemoryStatus(ref memInfo);
_isGetMemoryInfo = true;
}
return memInfo.dwTotalPhys;
}
}
[DllImport("kernel32")]
private static extern void GlobalMemoryStatus(ref MemoryInfo memInfo);
[StructLayout(LayoutKind.Sequential)]
internal struct MemoryInfo
{
internal uint dwLength;
internal uint dwMemoryLoad;
internal uint dwTotalPhys;
internal uint dwAvailPhys;
internal uint dwTotalPageFile;
internal uint dwAvailPageFile;
internal uint dwTotalVirtual;
internal uint dwAvailVirtual;
}