C++检测电脑配置信息.docx
《C++检测电脑配置信息.docx》由会员分享,可在线阅读,更多相关《C++检测电脑配置信息.docx(20页珍藏版)》请在冰点文库上搜索。
C++检测电脑配置信息
C++检测电脑配置信息
1、检测内存空间
/***获取物理内存和虚拟内存大小***/
VoidGetMemoryInfo(CString&dwTotalPhys,CString&dwTotalVirtual);
{
//TODO:
Addextrainitializationhere
MEMORYSTATUSMem;
//getthememorystatus
GlobalMemoryStatus(&Mem);
DWORDdwSize=(DWORD)Mem.dwTotalPhys/(1024*1024);
DWORDdwVirtSize=(DWORD)Mem.dwTotalVirtual/(1024*1024);
dwTotalPhys.Format(_T("物理内存:
%ldMB"),dwSize);
dwTotalVirtual.Format(_T("虚拟内存:
%ldMB"),dwVirtSize);
}
2、检测CPU型号
/****获取CPU名称、内核数目、主频*******/
VoidGetCpuInfo(CString&chProcessorName,CString&chProcessorType,DWORD&dwNum,DWORD&dwMaxClockSpeed)
{
CStringstrPath=_T("HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0");//注册表子键路径
CRegKeyregkey;//定义注册表类对象
LONGlResult;//LONG型变量-反应结果
lResult=regkey.Open(HKEY_LOCAL_MACHINE,LPCTSTR(strPath),KEY_ALL_ACCESS);//打开注册表键
if(lResult!
=ERROR_SUCCESS)
{
return;
}
WCHARchCPUName[50]={0};
DWORDdwSize=50;
//获取ProcessorNameString字段值
if(ERROR_SUCCESS==regkey.QueryStringValue(_T("ProcessorNameString"),chCPUName,&dwSize))
{
chProcessorName=chCPUName;
}
//查询CPU主频
DWORDdwValue;
if(ERROR_SUCCESS==regkey.QueryDWORDValue(_T("~MHz"),dwValue))
{
dwMaxClockSpeed=dwValue;
}
regkey.Close();//关闭注册表
//UpdateData(FALSE);
//获取CPU核心数目
SYSTEM_INFOsi;
memset(&si,0,sizeof(SYSTEM_INFO));
GetSystemInfo(&si);
dwNum=si.dwNumberOfProcessors;
switch(si.dwProcessorType)
{
casePROCESSOR_INTEL_386:
{
chProcessorType.Format(_T("Intel386processor"));
}
break;
casePROCESSOR_INTEL_486:
{
chProcessorType.Format(_T("Intel486Processor"));
}
break;
casePROCESSOR_INTEL_PENTIUM:
{
chProcessorType.Format(_T("IntelPentiumProcessor"));
}
break;
casePROCESSOR_INTEL_IA64:
{
chProcessorType.Format(_T("IntelIA64Processor"));
}
break;
casePROCESSOR_AMD_X8664:
{
chProcessorType.Format(_T("AMDX8664Processor"));
}
break;
default:
chProcessorType.Format(_T("未知"));
break;
}
}
3、检测硬盘信息
/****获取硬盘信息****/
voidGetDiskInfo(DWORD&dwNum,CStringchDriveInfo[])
{
DWORDDiskCount=0;
//利用GetLogicalDrives()函数可以获取系统中逻辑驱动器的数量,函数返回的是一个位无符号整型数据。
DWORDDiskInfo=GetLogicalDrives();
//通过循环操作查看每一位数据是否为,如果为则磁盘为真,如果为则磁盘不存在。
while(DiskInfo)
{
//通过位运算的逻辑与操作,判断是否为
Sleep(10);
if(DiskInfo&1)
{
DiskCount++;
}
DiskInfo=DiskInfo>>1;//通过位运算的右移操作保证每循环一次所检查的位置向右移动一位。
*/
}
if(dwNum{
return;//实际的磁盘数目大于dwNum
}
dwNum=DiskCount;//将磁盘分区数量保存
//-------------------------------------------------------------------//
//通过GetLogicalDriveStrings()函数获取所有驱动器字符串信息长度
intDSLength=GetLogicalDriveStrings(0,NULL);
WCHAR*DStr=newWCHAR[DSLength];
memset(DStr,0,DSLength);
//通过GetLogicalDriveStrings将字符串信息复制到堆区数组中,其中保存了所有驱动器的信息。
GetLogicalDriveStrings(DSLength,DStr);
intDType;
intsi=0;
BOOLfResult;
unsigned_int64i64FreeBytesToCaller;
unsigned_int64i64TotalBytes;
unsigned_int64i64FreeBytes;
//读取各驱动器信息,由于DStr内部数据格式是A:
\NULLB:
\NULLC:
\NULL,所以DSLength/4可以获得具体大循环范围
for(inti=0;i{
Sleep(10);
CStringstrdriver=DStr+i*4;
CStringstrTmp,strTotalBytes,strFreeBytes;
DType=GetDriveType(strdriver);//GetDriveType函数,可以获取驱动器类型,参数为驱动器的根目录
switch(DType)
{
caseDRIVE_FIXED:
{
strTmp.Format(_T("本地磁盘"));
}
break;
caseDRIVE_CDROM:
{
strTmp.Format(_T("DVD驱动器"));
}
break;
caseDRIVE_REMOVABLE:
{
strTmp.Format(_T("可移动磁盘"));
}
break;
caseDRIVE_REMOTE:
{
strTmp.Format(_T("网络磁盘"));
}
break;
caseDRIVE_RAMDISK:
{
strTmp.Format(_T("虚拟RAM磁盘"));
}
break;
caseDRIVE_UNKNOWN:
{
strTmp.Format(_T("虚拟RAM未知设备"));
}
break;
default:
strTmp.Format(_T("未知设备"));
break;
}
//GetDiskFreeSpaceEx函数,可以获取驱动器磁盘的空间状态,函数返回的是个BOOL类型数据
fResult=GetDiskFreeSpaceEx(strdriver,
(PULARGE_INTEGER)&i64FreeBytesToCaller,
(PULARGE_INTEGER)&i64TotalBytes,
(PULARGE_INTEGER)&i64FreeBytes);
if(fResult)
{
strTotalBytes.Format(_T("磁盘总容量%fMB"),(float)i64TotalBytes/1024/1024);
strFreeBytes.Format(_T("磁盘剩余空间%fMB"),(float)i64FreeBytesToCaller/1024/1024);
}
else
{
strTotalBytes.Format(_T(""));
strFreeBytes.Format(_T(""));
}
chDriveInfo[i]=strTmp+_T("(")+strdriver+_T("):
")+strTotalBytes+strFreeBytes;
si+=4;
}
}
4、检测显卡信息
/****获取显卡信息*****/
voidGetDisplayCardInfo(DWORD&dwNum,CStringchCardName[])
{
HKEYkeyServ;
HKEYkeyEnum;
HKEYkey;
HKEYkey2;
LONGlResult;//LONG型变量-保存函数返回值
//查询"SYSTEM\\CurrentControlSet\\Services"下的所有子键保存到keyServ
lResult=RegOpenKeyEx(HKEY_LOCAL_MACHINE,TEXT("SYSTEM\\CurrentControlSet\\Services"),0,KEY_READ,&keyServ);
if(ERROR_SUCCESS!
=lResult)
return;
//查询"SYSTEM\\CurrentControlSet\\Enum"下的所有子键保存到keyEnum
lResult=RegOpenKeyEx(HKEY_LOCAL_MACHINE,TEXT("SYSTEM\\CurrentControlSet\\Enum"),0,KEY_READ,&keyEnum);
if(ERROR_SUCCESS!
=lResult)
return;
inti=0,count=0;
DWORDsize=0,type=0;
for(;;++i)
{
Sleep(5);
size=512;
TCHARname[512]={0};//保存keyServ下各子项的字段名称
//逐个枚举keyServ下的各子项字段保存到name中
lResult=RegEnumKeyEx(keyServ,i,name,&size,NULL,NULL,NULL,NULL);
//要读取的子项不存在,即keyServ的子项全部遍历完时跳出循环
if(lResult==ERROR_NO_MORE_ITEMS)
break;
//打开keyServ的子项字段为name所标识的字段的值保存到key
lResult=RegOpenKeyEx(keyServ,name,0,KEY_READ,&key);
if(lResult!
=ERROR_SUCCESS)
{
RegCloseKey(keyServ);
return;
}
size=512;
//查询key下的字段为Group的子键字段名保存到name
lResult=RegQueryValueEx(key,TEXT("Group"),0,&type,(LPBYTE)name,&size);
if(lResult==ERROR_FILE_NOT_FOUND)
{
//键不存在
RegCloseKey(key);
continue;
};
//如果查询到的name不是Video则说明该键不是显卡驱动项
if(_tcscmp(TEXT("Video"),name)!
=0)
{
RegCloseKey(key);
continue;//返回for循环
};
//如果程序继续往下执行的话说明已经查到了有关显卡的信息,所以在下面的代码执行完之后要break第一个for循环,函数返回
lResult=RegOpenKeyEx(key,TEXT("Enum"),0,KEY_READ,&key2);
RegCloseKey(key);
key=key2;
size=sizeof(count);
lResult=RegQueryValueEx(key,TEXT("Count"),0,&type,(LPBYTE)&count,&size);//查询Count字段(显卡数目)
dwNum=count;//保存显卡数目
for(intj=0;j{
TCHARsz[512]={0};
TCHARname[64]={0};
wsprintf(name,TEXT("%d"),j);
size=sizeof(sz);
lResult=RegQueryValueEx(key,name,0,&type,(LPBYTE)sz,&size);
lResult=RegOpenKeyEx(keyEnum,sz,0,KEY_READ,&key2);
if(ERROR_SUCCESS)
{
RegCloseKey(keyEnum);
return;
}
size=sizeof(sz);
lResult=RegQueryValueEx(key2,TEXT("FriendlyName"),0,&type,(LPBYTE)sz,&size);
if(lResult==ERROR_FILE_NOT_FOUND)
{
size=sizeof(sz);
lResult=RegQueryValueEx(key2,TEXT("DeviceDesc"),0,&type,(LPBYTE)sz,&size);
chCardName[j]=sz;//保存显卡名称
};
RegCloseKey(key2);
key2=NULL;
};
RegCloseKey(key);
key=NULL;
break;
}
}
5、检测声卡信息
/****添加头文件信息*****/
#include//#include
#pragmacomment(lib,"winmm.lib")
/****获取声卡信息*****/
voidGetSoundDevice(DWORD&dwNum,CStringchCardName[])
{
//检测声卡
intwavedevice/*,mididevice*/;
WAVEOUTCAPSwavecap;
/*MIDIOUTCAPSmidicap;*/
wavedevice=(int)waveOutGetNumDevs();//波形设备信息
//mididevice=(int)midiOutGetNumDevs();//MIDI设备信息
if(wavedevice>0)
{
for(inti=0;i{
waveOutGetDevCaps(i,&wavecap,sizeof(WAVEOUTCAPS));
/*OutputDebugString(wavecap.szPname);
OutputDebugString(_T("\n"));*/
chCardName[i]=wavecap.szPname;
}
}
//if(mididevice>0)
//{
//for(inti=0;i//{
//midiOutGetDevCaps(i,&midicap,sizeof(MIDIOUTCAPS));
//OutputDebugString(midicap.szPname);
//OutputDebugString(_T("\n"));
//chCardName[wavedevice+i]=midicap.szPname;
//}
//}
dwNum=wavedevice/*+mididevice*/;
return;
}
系统文件mmsystem.h提供声卡(音频输出)读取接口,函数为waveOutGetNumDevs,另外音频输入接口函数为waveInGetNumDevs,详细了解mmsystem.h
小问题:
Mmsystem.h文件
typedefstructtagWAVEOUTCAPSW{
WORDwMid;/*manufacturerID*/
WORDwPid;/*productID*/
MMVERSIONvDriverVersion;/*versionofthedriver*/
WCHARszPname[MAXERRORLENGTH];/*productname(NULLterminatedstring)*/
DWORDdwFormats;/*formatssupported*/
WORDwChannels;/*numberofsourcessupported*/
WORDwReserved1;/*packing*/
DWORDdwSupport;/*functionalitysupportedbydriver*/
}WAVEOUTCAPSW,*PWAVEOUTCAPSW,*NPWAVEOUTCAPSW,*LPWAVEOUTCAPSW;
#ifdefUNICODE
typedefWAVEOUTCAPSWWAVEOUTCAPS;
***szPname的取值较小,建议微软修改大小
/*generalconstants*/
#defineMAXPNAMELEN32/*maxproductnamelength(includingNULL)*/
#defineMAXERRORLENGTH256/*maxerrortextlength(includingNULL)*/
#defineMAX_JOYSTICKOEMVXDNAME260/*maxoemvxdnamelength(includingNULL)*/
参考链接:
http:
//snailzhang-126-
6、检测网卡信息
/****声明变量*****/
private:
CStringListInterfaces;//保存所有网卡的名字
CListBandwidths;//各网卡的带宽
CListTotalTraffics;//各网卡的总流量
/***********获取网卡数目和名字***********/
voidGetInterFace(DWORD&dwNum,CStringchCardName[])
{
/*CGetNetDatapNet;
DWORDpCount=pNet.GetNetworkInterfacesCount();
returnpCount;*/
try
{
#defineDEFAULT_BUFFER_SIZE40960L
unsignedchar*data=(unsignedchar*)malloc(DEFAULT_BUFFER_SIZE);
DWORDtype;
DWORDsize=DEFAULT_BUFFER_SIZE;
DWORDret;
chars_key[4096];
sprintf_s(s_key,4096,"510");
//RegQueryValueEx的固定调用格式
CStringstr(s_key);
//如果RegQueryValueEx函数执行失败则进入循环
while((ret=RegQueryValueEx(HKEY_PERFORMANCE_DATA,str,0,&type,data,&size))!
=ERROR_SUCCESS)
{
Sleep(10);
//如果RegQueryValueEx的返回值为ERROR_MORE_DATA(申请的内存区data太小,不能容纳RegQueryValueEx返回的数据)
if(ret==ERROR_MORE_DATA)
{
Sleep(10);
size+=DEFAULT_BUFFER_SIZE;
d