385.使用CAPI读取系统信息

一赫技术 2024-04-05 01:36:15

在C#中,我们可以使用Windows API来获取系统信息,例如获取CPU信息、内存信息、磁盘信息等。下面我们将演示如何使用C#调用系统Windows API来读取系统信息。

获取CPU信息processorArchitecture: 表示处理器架构,例如 x86、x64 等pageSize: 表示页面大小,通常是内存页面的大小,以字节为单位minimumApplicationAddress: 表示应用程序可以使用的最小内存地址maximumApplicationAddress: 表示应用程序可以使用的最大内存地址activeProcessorMask: 表示活动处理器的位掩码numberOfProcessors: 表示系统中的处理器数量processorType: 表示处理器类型allocationGranularity: 表示内存分配的粒度processorLevel: 表示处理器级别processorRevision: 表示处理器修订版本using System;using System.Runtime.InteropServices;class Program{ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public struct SYSTEM_INFO { public ushort processorArchitecture; public uint pageSize; public IntPtr minimumApplicationAddress; public IntPtr maximumApplicationAddress; public IntPtr activeProcessorMask; public uint numberOfProcessors; public uint processorType; public uint allocationGranularity; public ushort processorLevel; public ushort processorRevision; } [DllImport("kernel32.dll")] public static extern void GetSystemInfo(out SYSTEM_INFO si); static void Main() { SYSTEM_INFO si; GetSystemInfo(out si); Console.WriteLine("Number of Processors: " + si.numberOfProcessors); Console.WriteLine("Processor Type: " + si.processorType); }}

获取内存信息dwLength: 结构体的长度,需要在调用 GlobalMemoryStatusEx 函数之前设置为结构体的大小dwMemoryLoad: 表示当前系统内存的使用率,以百分比表示ullTotalPhys: 表示系统的总物理内存大小,以字节为单位ullAvailPhys: 表示系统当前可用的物理内存大小,以字节为单位ullTotalPageFile: 表示系统的总页面文件大小,以字节为单位ullAvailPageFile: 表示系统当前可用的页面文件大小,以字节为单位ullTotalVirtual: 表示系统的总虚拟内存大小,以字节为单位ullAvailVirtual: 表示系统当前可用的虚拟内存大小,以字节为单位ullAvailExtendedVirtual: 表示系统当前进程可以使用的扩展虚拟内存大小,以字节为单位class Program{ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public struct MEMORYSTATUSEX { 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; } [DllImport("kernel32.dll")] public static extern bool GlobalMemoryStatusEx(ref MEMORYSTATUSEX lpBuffer); static void Main() { MEMORYSTATUSEX memStatus = new MEMORYSTATUSEX(); memStatus.dwLength = (uint)Marshal.SizeOf(typeof(MEMORYSTATUSEX)); if (GlobalMemoryStatusEx(ref memStatus)) { Console.WriteLine("Total Physical Memory: " + memStatus.ullTotalPhys); Console.WriteLine("Available Physical Memory: " + memStatus.ullAvailPhys); Console.WriteLine("Total Virtual Memory: " + memStatus.ullTotalVirtual); Console.WriteLine("Available Virtual Memory: " + memStatus.ullAvailVirtual); } else { Console.WriteLine("Failed to retrieve memory status."); } }}

获取磁盘信息class Program{ // 定义用于获取磁盘信息的结构体 [StructLayout(LayoutKind.Sequential)] public struct DiskInfo { public uint BytesPerSector; public uint SectorsPerCluster; public uint NumberOfFreeClusters; public uint TotalNumberOfClusters; } // 声明用于获取磁盘信息的Windows API函数 [DllImport("kernel32.dll", SetLastError = true)] public static extern bool GetDiskFreeSpace(string lpRootPathName, out uint lpSectorsPerCluster, out uint lpBytesPerSector, out uint lpNumberOfFreeClusters, out uint lpTotalNumberOfClusters); [DllImport("kernel32.dll", SetLastError = true)] public static extern bool GetDiskFreeSpaceEx(string lpDirectoryName, out ulong lpFreeBytesAvailable, out ulong lpTotalNumberOfBytes, out ulong lpTotalNumberOfFreeBytes); static void Main() { // 获取磁盘信息 string rootPath = "C:\\"; // 选择要获取信息的磁盘根目录 uint sectorsPerCluster, bytesPerSector, numberOfFreeClusters, totalNumberOfClusters; bool result = GetDiskFreeSpace(rootPath, out sectorsPerCluster, out bytesPerSector, out numberOfFreeClusters, out totalNumberOfClusters); if (result) { // 将获取到的磁盘信息存储到结构体中 DiskInfo diskInfo = new DiskInfo { BytesPerSector = bytesPerSector, SectorsPerCluster = sectorsPerCluster, NumberOfFreeClusters = numberOfFreeClusters, TotalNumberOfClusters = totalNumberOfClusters }; // 输出获取到的磁盘信息 Console.WriteLine("磁盘信息:"); Console.WriteLine("每个簇的扇区数: " + diskInfo.SectorsPerCluster); Console.WriteLine("每个扇区的字节数: " + diskInfo.BytesPerSector); Console.WriteLine("可用的簇数: " + diskInfo.NumberOfFreeClusters); Console.WriteLine("簇的总数: " + diskInfo.TotalNumberOfClusters); } else { Console.WriteLine("获取磁盘信息失败!"); } // 获取磁盘大小信息 ulong freeBytesAvailable, totalNumberOfBytes, totalNumberOfFreeBytes; bool sizeResult = GetDiskFreeSpaceEx(rootPath, out freeBytesAvailable, out totalNumberOfBytes, out totalNumberOfFreeBytes); if (sizeResult) { // 输出获取到的磁盘大小信息 Console.WriteLine("磁盘大小信息:"); Console.WriteLine("可用空间: " + freeBytesAvailable + " bytes"); Console.WriteLine("总空间: " + totalNumberOfBytes + " bytes"); Console.WriteLine("可用空间总数: " + totalNumberOfFreeBytes + " bytes"); } else { Console.WriteLine("获取磁盘大小信息失败!"); } }}

以上就是使用C#调用系统Windows API读取系统信息的示例代码,通过这些示例代码,我们可以获取到系统的CPU信息、内存信息和磁盘信息。希望对你有所帮助!

0 阅读:0

一赫技术

简介:感谢大家的关注