C#获取电脑系统信息和硬件信息,兼容XP/Win7/Win10(依赖System.Management.dll)

20 篇文章 16 订阅
14 篇文章 1 订阅

一、前言

需要做一个.NET桌面应用程序,有一个功能需求:获取电脑系统信息和硬件信息。
写篇文章来讲下。

二、具体实现

1、引入System.Management.dll

右键工程引用,点击添加引用
在这里插入图片描述
点击浏览
在这里插入图片描述
找到C盘中.NETFramework目录中的System.Management.dll
比如我的是:
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v3.5\Profile\Client
在这里插入图片描述
具体的.NETFramework版本根据你自己的情况而定。
点击确定。
在这里插入图片描述
添加成功。
在这里插入图片描述

2、引入命名空间
using System.Management;
3、获取系统信息
ManagementClass manag = new ManagementClass("Win32_OperatingSystem");
ManagementObjectCollection managCollection = manag.GetInstances();
foreach (ManagementObject m in managCollection)
{
    Console.WriteLine("操作系统: " + m["Name"].ToString());
}

运行结果:

操作系统: Microsoft Windows 10 专业版|C:\windows|\Device\Harddisk0\Partition1
4、获取CPU信息
ManagementClass mcCPU = new ManagementClass("Win32_Processor");
ManagementObjectCollection mocCPU = mcCPU.GetInstances();
foreach (ManagementObject m in mocCPU)
{
    Console.WriteLine("CPU: " + m["Name"].ToString());
}

运行结果:

CPU: Intel(R) Core(TM) i5-4590 CPU @ 3.30GHz
5、获取内存信息
ManagementObjectSearcher searcher = new ManagementObjectSearcher();   //用于查询一些如系统信息的管理对象
searcher.Query = new SelectQuery("Win32_PhysicalMemory", "", new string[] { "Capacity" });//设置查询条件
ManagementObjectCollection collection = searcher.Get();   //获取内存容量
ManagementObjectCollection.ManagementObjectEnumerator em = collection.GetEnumerator();
long capacity = 0;
while (em.MoveNext())
{
    ManagementBaseObject baseObj = em.Current;
    if (baseObj.Properties["Capacity"].Value != null)
    {
        capacity += long.Parse(baseObj.Properties["Capacity"].Value.ToString());
    }
}
Console.WriteLine("内存: " + capacity / 1024 / 1024 / 1024 + "GB");

运行结果:

内存: 16GB
6、获取硬盘信息
System.IO.DriveInfo[] drives = System.IO.DriveInfo.GetDrives();
long totalFreeSpace = 0;
long totalDiskSize = 0;
foreach (var drive in drives)
{
	if (drive.IsReady)  //判断代码运行时 磁盘是可操作作态
	{
	    totalFreeSpace += drive.AvailableFreeSpace;
	    totalDiskSize += drive.TotalSize;
	}
}
Console.WriteLine(string.Format("硬盘总容量: {0} 剩余: {1}", totalDiskSize / 1024 / 1024 / 1024 + "GB", totalFreeSpace / 1024 / 1024 / 1024 + "GB"));

运行结果:

硬盘总容量: 1378GB 剩余: 870GB
7、获取显卡信息
ManagementClass manage = new ManagementClass("Win32_VideoController");
ManagementObjectCollection manageCollection = manage.GetInstances();
if (null == manageCollection)
{
    Console.WriteLine("显卡: 未知");
}
else
{
    foreach (ManagementObject m in manageCollection)
    {
        if (null == m["VideoProcessor"])
        {
            Console.WriteLine("显卡: 未知");
        }
        else
        {
            Console.Write("显卡: " + m["VideoProcessor"].ToString() + " | ");
            var graphicsCardRam = Convert.ToInt64(m["AdapterRAM"]);
            if (graphicsCardRam >= 1024 * 1024 * 1024)
                Console.WriteLine((graphicsCardRam / 1024 / 1024 / 1024) + "GB");
            else
                Console.WriteLine((graphicsCardRam / 1024 / 1024) + "MB");
        }

    }
}

运行结果:

显卡: GeForce GT 740 | 2GB
显卡: Intel(R) HD Graphics Family | 1GB

三、兼容XP/Win7/Win10

将工程的目标框架改为.NET Framework 2.0版本。
在这里插入图片描述

四、补充,Windows API:GetSystemInfo接口

上面的方法需要引用System.Management.dll,我们可以通过Windows APIGetSystemInfo接口来获取CPU相关的信息。
C#接口声明:

[StructLayout(LayoutKind.Sequential)]
internal struct SYSTEM_INFO
{
    // cpu 架构: x86_64、ARM、x86、
    internal ushort wProcessorArchitecture;
    // 保留
    internal ushort wReserved;
    // 分页大小
    internal uint dwPageSize;
    // 最小寻址空间
    internal IntPtr lpMinimumApplicationAddress;
    // 最大寻址空间
    internal IntPtr lpMaximumApplicationAddress;
    // 处理器掩码; 0..31 表示不同的处理器
    internal IntPtr dwActiveProcessorMask;
    // cpu 个数
    internal uint dwNumberOfProcessors;
    // cpu 类型
    internal uint dwProcessorType;
    // 虚拟内存空间的粒度
    internal uint dwAllocationGranularity;
    // cpu 级别
    internal ushort wProcessorLevel;
    // cpu 版本
    internal ushort wProcessorRevision;

}

[DllImport("kernel32")]
static extern void GetSystemInfo(ref SYSTEM_INFO pSI);

调用

SYSTEM_INFO pSI = new SYSTEM_INFO();
GetSystemInfo(ref pSI);
FieldInfo[] fis = pSI.GetType().GetFields(BindingFlags.Instance | BindingFlags.NonPublic);
foreach (var fi in fis)
{
    Console.WriteLine(fi.Name + ": " + fi.GetValue(pSI));
}

运行结果:

wProcessorArchitecture: 9
wReserved: 0
dwPageSize: 4096
lpMinimumApplicationAddress: 65536
lpMaximumApplicationAddress: 140737488289791
dwActiveProcessorMask: 15
dwNumberOfProcessors: 4
dwProcessorType: 8664
dwAllocationGranularity: 65536
wProcessorLevel: 6
wProcessorRevision: 15363

参数说明:

wProcessorArchitecture:系统处理器结构。
PROCESSOR_ARCHITECTURE_AMD64 = 9; // x64
PROCESSOR_ARCHITECTURE_IA64 = 6; // Intel 服务器
PROCESSOR_ARCHITECTURE_INTEL = 0; //x86
wReserved:保留留给未来使用。
dwPageSize:页面的大小和页面保护的承若与粒度,这是通过使用virtualAlloc函数去决定页面大小。
lpMinimumApplicationAddress:最低内存地址的指针,访问应用程序和动态链接库(DLLs)
lpMaximumApplicationAddress:最高内存地址的指针,访问应用程序和动态链接库
dwActiveProcessorMask:一个代表系统中设置处理器的配置的处理器集。Bit 0 是处理器0,Bit 31是处理器31.
dwNumberOfProcessors:系统中的处理器的数目。
dwProcessorType: 系统中处理器的类型。
如下:
PROCESSOR_INTEL_386
PROCESSOR_INTEL_486
PROCESSOR_INTEL_PENTIUM
PROCESSOR_MIPS_R3000
PROCESSOR_MIPS_R4000
PROCESSOR_HITACHI_SH3
PROCESSOR_HITACHI_SH4
PROCESSOR_PPC_403
PROCESSOR_PPC_821
PROCESSOR_STRONGARM
PROCESSOR_ARM720
dwAllocationGranularity:指定粒度和虚拟内存的分配,例如一个一字节的VirtualAlloc函数请求分配将保留
wProcessorLevel:系统的体系结构相关的处理器的水平。
wProcessorRevision:基于体系结构的处理器的修订。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林新发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值