C++ 使用 Windows API 获取计算机基本信息示例
在软件开发和运维中,自动识别目标机的硬件规格与系统环境是常见需求。本文汇总了利用 C++ 调用 Windows API 获取操作系统版本、CPU 数量、内存大小、磁盘容量、屏幕分辨率、网络 IP 以及电源状态的方法,提供可直接编译的完整代码示例。
Windows 计算机的基本信息组成
在编写自动化脚本或安装程序时,准确判断运行环境至关重要。一台标准 Windows 计算机包含以下维度的关键信息:
- 操作系统版本:包括主版本号、次版本号和服务包信息,可通过系统属性查看。
- 处理器(CPU):制造商、型号、核心数量及运算能力。
- 内存(RAM):总物理内存容量与当前使用情况。
- 硬盘存储:各分区的总容量、已用空间和可用空间。
- 显示器配置:屏幕分辨率(宽×高)、色彩深度及设备型号。
- 网络连接:网卡型号、IPv4 地址及 MAC 地址。
- 驱动程序:设备驱动的具体版本号。
- 电源状态:交流电连接情况、笔记本电池的剩余电量百分比及预计使用时间。
基础信息与硬件参数的获取方法
C++ 开发者可以通过 <windows.h> 头文件中提供的各种 API 接口来检索上述数据。以下是一个综合性的示例代码,演示了如何在一个进程中依次获取 OS 版本、CPU 数量、内存大小、C盘空间、屏幕信息及 IP 地址。
第 1 步:初始化环境与依赖库
引入必要的头文件并链接版本库,以便使用文件版本查询功能。
#include <iostream>
#include <windows.h>
#include <tchar.h>
#pragma comment(lib, "version.lib")
第 2 步:获取操作系统版本
使用 GetVersionEx 函数填充结构体,输出操作系统的构建号。
OSVERSIONINFOEX osvi = {0};
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
// 注意:新版 Windows API 推荐使用 GetVersion,此处沿用经典写法
GetVersionEx((LPOSVERSIONINFO)&osvi);
std::cout << "Operating System: Windows " << osvi.dwMajorVersion
<< "." << osvi.dwMinorVersion << "." << osvi.dwBuildNumber << std::endl;
第 3 步:获取处理器信息
通过 GetSystemInfo 获取逻辑处理器的数量和类型标识。
SYSTEM_INFO sysinfo = {0};
GetSystemInfo(&sysinfo);
std::cout << "Processor Count: " << sysinfo.dwNumberOfProcessors
<< " x Type " << sysinfo.dwProcessorType << std::endl;
第 4 步:获取内存信息
调用 GlobalMemoryStatusEx 函数查询物理内存总量。为了可读性,通常将字节数转换为 MB。
MEMORYSTATUSEX meminfo = {0};
meminfo.dwLength = sizeof(MEMORYSTATUSEX);
GlobalMemoryStatusEx(&meminfo);
std::cout << "Total Memory: " << meminfo.ullTotalPhys / (1024 * 1024)
<< " MB" << std::endl;
第 5 步:获取硬盘信息
使用 GetDiskFreeSpaceEx 查询特定路径(如 “C:\”)的磁盘空间大小。
ULARGE_INTEGER diskinfo = {0};
// 查询 C 盘的可用空间
if (GetDiskFreeSpaceEx(_T("C:\\"), NULL, &diskinfo, NULL)) {
std::cout << "Disk Space: " << diskinfo.QuadPart / (1024 * 1024 * 1024)
<< " GB" << std::endl;
}
第 6 步:获取显示器信息
创建显示设备上下文(HDC),并使用 GetDeviceCaps 获取分辨率和位深。
HDC hdc = GetDC(NULL);
int width = GetDeviceCaps(hdc, HORZRES);
int height = GetDeviceCaps(hdc, VERTRES);
int bpp = GetDeviceCaps(hdc, BITSPIXEL);
ReleaseDC(NULL, hdc); // 务必释放 HDC
std::cout << "Display: " << width << " x " << height
<< " x " << bpp << " bits" << std::endl;
第 7 步:获取网络适配器信息
此步骤涉及分配缓冲区以存储 IP_ADAPTER_INFO 结构数组。首先请求所需长度,再实际获取数据。
IP_ADAPTER_INFO* adapterinfo = NULL;
DWORD buflen = 0;
GetAdaptersInfo(NULL, &buflen);
adapterinfo = (IP_ADAPTER_INFO*) malloc(buflen);
if (GetAdaptersInfo(adapterinfo, &buflen) == ERROR_SUCCESS) {
std::cout << "First Adapter IP: " << adapterinfo->IpAddressList.IpAddress.String
<< std::endl;
}
free(adapterinfo); // 必须手动释放动态分配的内存
第 8 步:获取当前进程的文件版本(模拟驱动/软件版本)
虽然这主要是针对程序自身的版本,但也展示了如何使用 GetFileVersionInfo 系列 API。若需获取具体硬件驱动版本,需遍历注册表或使用 WMI,此处仅作为 API 调用演示。
TCHAR filename[MAX_PATH] = {0};
GetModuleFileName(NULL, filename, MAX_PATH);
DWORD handle = 0;
DWORD size = GetFileVersionInfoSize(filename, &handle);
if (size > 0) {
BYTE* buffer = new BYTE[size];
if (GetFileVersionInfo(filename, handle, size, buffer)) {
VS_FIXEDFILEINFO* fileInfo = NULL;
UINT len = 0;
if (VerQueryValue(buffer, _T("\\"), (void**)&fileInfo, &len)) {
std::cout << "File Version: " << HIWORD(fileInfo->dwProductVersionMS)
<< "." << LOWORD(fileInfo->dwProductVersionMS) << std::endl;
}
}
delete[] buffer;
}
获取 Windows 电源状态详情
对于笔记本电脑或便携式设备的应用,监测电源状态(AC 电源线是否连接、电池剩余电量)尤为重要。以下代码专门演示如何使用 PowrProf.h 库实现该功能。
准备工作
确保代码包含 <PowrProf.h> 并链接 PowrProf.lib。
#include <Windows.h>
#include <PowrProf.h>
#include <iostream>
#pragma comment(lib, "PowrProf.lib")
执行代码
调用 GetSystemPowerStatus 函数读取 SYSTEM_POWER_STATUS 结构体的字段。
int main() {
SYSTEM_POWER_STATUS powerStatus;
if (GetSystemPowerStatus(&powerStatus)) {
std::cout << "AC Line Status: " << static_cast<int>(powerStatus.ACLineStatus)
<< std::endl;
std::cout << "Battery Flag: " << static_cast<int>(powerStatus.BatteryFlag)
<< std::endl;
std::cout << "Battery Life Percent: " << static_cast<int>(powerStatus.BatteryLifePercent)
<< std::endl;
std::cout << "Battery Life Time: " << powerStatus.BatteryLifeTime
<< " sec" << std::endl;
std::cout << "Battery Full Life Time: " << powerStatus.BatteryFullLifeTime
<< " sec" << std::endl;
} else {
std::cerr << "Failed to get power status." << std::endl;
}
return 0;
}
关键字段释义
- ACLineStatus:1 表示连接交流电源,0 表示未连接。
- BatteryFlag:指示电池状态,例如 0 为无电池,1 为使用中,2 为充电中,3 为已满。
- BatteryLifePercent:剩余电量百分比(-1 表示未知),注意该值由硬件直接报告,可能不精确。
- BatteryLifeTime:剩余使用时间(秒),若无法估算则返回 -1。
总结
通过熟练运用 Windows API,开发者可以低成本地构建出能够自适应不同硬件环境和网络条件的应用程序。无论是在软件发布前的兼容性检查,还是在系统监控工具的开发中,准确获取 CPU、内存、磁盘、网络和电源信息都是基础且关键的一环。以上代码涵盖了最常用的查询场景,可根据实际需求截取相应部分进行集成。以上就是 C++ 使用 Windows API 获取计算机基本信息的详细内容,更多关于 C++ 系统信息查询与硬件检测的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









