写点什么

如何使用 C# 获取 Windows 系统信息以及 CPU、内存和磁盘使用情况

作者:哦豁完蛋了
  • 2024-08-09
    四川
  • 本文字数:5375 字

    阅读完需:约 18 分钟

如何使用C# 获取Windows系统信息以及CPU、内存和磁盘使用情况

一个简单的小工具,主要用来获取当期的电脑信息以及内存的使用情况。本来也没想着写这个玩意,还不如随便下个相关的软件好使,但是前一段时间为了追查系统卡顿的问题,所以就加上了一段统计内存的代码,用来看看是否由这个引起的。


既然统计了内存相关的数据,干脆一不做二不休,又加了下 CPU 以及硬盘的使用情况统计。


统计的准确不准确我也不好说,因为我也不太能确定,暂且就做个参考值吧。或许使用很多大佬封装过的第三方 DLL 会准确很多。


下面工具中还展示了部分关于电脑的基本信息数据,这个在之前的时候应该是有发过,我只是单纯的拿了过来(功能实现的多看着洋气)。


主要还是使用 windows WMI,虽然下列关于内存情况的统计没用(但其实也可以统计到),因为我感觉这个方式可能稍微准确点。。。


实现功能:


获取系统内存、CPU 的使用情况开发环境:


开发工具:Visual Studio 2013


.NET Framework 版本:4.5


实现代码:


public class SystemUtil{#region 内存


    #region 获得内存信息API    [DllImport("kernel32.dll")]    [return: MarshalAs(UnmanagedType.Bool)]    private static extern bool GlobalMemoryStatusEx(ref MEMORY_INFO mi);    //定义内存的信息结构    [StructLayout(LayoutKind.Sequential)]    private struct MEMORY_INFO    {        public uint DWLength; //当前结构体大小        public uint DWMemoryLoad; //当前内存使用率        public ulong ullTotalPhys; //总计物理内存大小        public ulong ullAvailPhys; //可用物理内存大小        public ulong ullTotalPagefile; //总计交换文件大小        public ulong ullAvailPagefile; //总计交换文件大小        public ulong ullTotalVirtual; //总计虚拟内存大小        public ulong ullAvailVirtual; //可用虚拟内存大小        public ulong ullAvailExtendedVirtual; //保留 这个值始终为0    }
private static MEMORY_INFO GetMemoryInfo() { MEMORY_INFO MemoryInfo = new MEMORY_INFO(); MemoryInfo.DWLength = (uint)System.Runtime.InteropServices.Marshal.SizeOf(MemoryInfo); GlobalMemoryStatusEx(ref MemoryInfo); return MemoryInfo; } #endregion
/// <summary> /// 获取系统内存 /// </summary> /// <returns></returns> public static string GetSysMemory() { MEMORY_INFO MemoryInfo = GetMemoryInfo(); return ConvertBytes((long)MemoryInfo.ullTotalPhys); }
/// <summary> /// 获取剩余内存 /// </summary> /// <returns></returns> public static string GetUnUsedMemory() { MEMORY_INFO MemoryInfo = GetMemoryInfo(); return ConvertBytes((long)MemoryInfo.ullAvailPhys); }

/// <summary> /// 获取已使用内存 /// </summary> /// <returns></returns> public static string GetUsedMemory() { MEMORY_INFO MemoryInfo = GetMemoryInfo();
return ConvertBytes((long)(MemoryInfo.ullTotalPhys - MemoryInfo.ullAvailPhys)); }

/// <summary> /// 获取应用使用内存 /// </summary> /// <param name="appName"></param> /// <returns></returns> public static string GetAppMemory(string appName) { Process CurrentProcess = Process.GetProcessesByName(appName)[0]; PerformanceCounter Perform = new PerformanceCounter("Process", "Working Set - Private", CurrentProcess.ProcessName); return ConvertBytes((long)Perform.NextValue()); }
/// <summary> /// 获取当前应用使用内存 /// </summary> /// <returns></returns> public static string GetCurrentAppMemory() { long memory = Process.GetCurrentProcess().PrivateMemorySize64; return ConvertBytes(memory); }

#endregion
#region CPU /// <summary> /// 获取CPU使用率 /// </summary> /// <returns></returns> public static string GetUsedCPU() { ManagementClass mc = new ManagementClass("Win32_PerfFormattedData_PerfOS_Processor"); ManagementObjectCollection moc = mc.GetInstances(); List<string> list = new List<string>();
foreach (ManagementObject mo in moc) { if (mo["Name"].ToString() == "_Total") { list.Add(mo["PercentProcessorTime"].ToString()); } } return list.Sum(s => int.Parse(s)) + "%"; } #endregion
#region 硬盘 public static string GetUsedDisk() { ManagementClass mc = new ManagementClass("Win32_PerfFormattedData_PerfDisk_PhysicalDisk"); ManagementObjectCollection moc = mc.GetInstances(); List<string> list = new List<string>();
foreach (ManagementObject mo in moc) { if (mo["Name"].ToString() == "_Total") { list.Add(mo["PercentDiskTime"].ToString()); } } return list.Sum(s => int.Parse(s)) + "%"; }
#endregion
#region 电脑信息 /// <summary> /// 获取CPU序列号 /// </summary> /// <returns></returns> public static string GetCpuID() { ManagementClass mc = new ManagementClass("Win32_Processor"); ManagementObjectCollection moc = mc.GetInstances(); List<string> list = new List<string>(); foreach (ManagementObject mo in moc) { list.Add(mo.Properties["ProcessorId"].Value.ToString()); } return string.Join("|", list);
//若需要获取所有属性,可迭代ManagementObject.Properties //foreach (PropertyData pd in mo.Properties) //{ // Console.WriteLine(pd.Name + "----" + pd.Value); //} }
/// <summary> /// 获取Mac地址 /// </summary> /// <returns></returns> public static string GetMac() { ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration"); ManagementObjectCollection moc = mc.GetInstances(); List<string> list = new List<string>(); foreach (ManagementObject mo in moc) { if ((bool)mo["IPEnabled"] == true) { list.Add(mo["MacAddress"].ToString()); } } return string.Join("|", list); }
/// <summary> /// 获取IP地址 /// </summary> /// <returns></returns> public static string GetIp() { ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration"); ManagementObjectCollection moc = mc.GetInstances(); List<string> list = new List<string>(); foreach (ManagementObject mo in moc) { if ((bool)mo["IPEnabled"] == true) { list.Add(((Array)mo.Properties["IpAddress"].Value).GetValue(0).ToString()); } } return string.Join("|", list); }
/// <summary> /// 获取硬盘序列号 /// </summary> /// <returns></returns> public static string GetDiskID() { ManagementClass mc = new ManagementClass("Win32_DiskDrive"); ManagementObjectCollection moc = mc.GetInstances(); List<string> list = new List<string>(); foreach (ManagementObject mo in moc) { list.Add(mo.Properties["Model"].Value.ToString()); } return string.Join("|", list); }
/// <summary> /// 获取系统名称 /// </summary> /// <returns></returns> public static string GetSystemName() { ManagementClass mc = new ManagementClass("Win32_ComputerSystem"); ManagementObjectCollection moc = mc.GetInstances(); List<string> list = new List<string>(); foreach (ManagementObject mo in moc) { list.Add(mo["Name"].ToString()); } return string.Join("|", list); // return System.Environment.GetEnvironmentVariable("ComputerName") }
/// <summary> /// 获取当前登录用户 /// </summary> /// <returns></returns> public static string GetLoginUser() { ManagementClass mc = new ManagementClass("Win32_ComputerSystem"); ManagementObjectCollection moc = mc.GetInstances(); List<string> list = new List<string>(); foreach (ManagementObject mo in moc) { list.Add(mo["UserName"].ToString()); } return string.Join("|", list); }
/// <summary> /// 获取电脑类型 /// </summary> /// <returns></returns> public static string GetPcType() { ManagementClass mc = new ManagementClass("Win32_ComputerSystem"); ManagementObjectCollection moc = mc.GetInstances(); List<string> list = new List<string>(); foreach (ManagementObject mo in moc) { list.Add(mo["SystemType"].ToString()); } return string.Join("|", list); }
/// <summary> /// 获取系统内存 /// </summary> /// <returns></returns> public static string GetSysMemory2() { ManagementClass mc = new ManagementClass("Win32_ComputerSystem"); ManagementObjectCollection moc = mc.GetInstances(); List<string> list = new List<string>(); foreach (ManagementObject mo in moc) { list.Add(mo["TotalPhysicalMemory"].ToString()); } return string.Join("|", list); }
/// <summary> /// 获取剩余内存 /// </summary> /// <returns></returns> public static string GetUnUsedMemory2() { ManagementClass mc = new ManagementClass("Win32_PerfFormattedData_PerfOS_Memory"); ManagementObjectCollection moc = mc.GetInstances(); long memory = 0; foreach (ManagementObject mo in moc) { memory += long.Parse(mo.Properties["AvailableMBytes"].Value.ToString()); } return ConvertBytes(memory); }
/// <summary> /// 获取电脑品牌 /// </summary> /// <returns></returns> public static string GetPcBrand() { ManagementClass mc = new ManagementClass("Win32_ComputerSystem"); ManagementObjectCollection moc = mc.GetInstances(); List<string> list = new List<string>(); foreach (ManagementObject mo in moc) { list.Add(mo["Manufacturer"].ToString()); } return string.Join("|", list); }
/// <summary> /// 获取电脑型号 /// </summary> /// <returns></returns> public static string GetPcModel() { ManagementClass mc = new ManagementClass("Win32_ComputerSystem"); ManagementObjectCollection moc = mc.GetInstances(); List<string> list = new List<string>(); foreach (ManagementObject mo in moc) { list.Add(mo["SystemFamily"].ToString()); } return string.Join("|", list); } #endregion
public static string ConvertBytes(long len) { double dlen = len; string[] sizes = { "B", "KB", "MB", "GB", "TB" }; int order = 0; while (dlen >= 1024 && order + 1 < sizes.Length) { order++; dlen = dlen / 1024; } return String.Format("{0:0.##} {1}", dlen, sizes[order]); }}
复制代码


实现效果:

发布于: 刚刚阅读数: 2
用户头像

还未添加个人签名 2024-07-12 加入

还未添加个人简介

评论

发布
暂无评论
如何使用C# 获取Windows系统信息以及CPU、内存和磁盘使用情况_哦豁完蛋了_InfoQ写作社区