请问用什么方法获得机器的详细硬件信息?
注册表的信息实在太少,如何才能得到系统所有硬件的详细描述呢?
小弟一点头绪都没有,望高手指点!
问题点数:100、回复次数:18Top
1 楼louifox(兰陵笑笑生)回复于 2002-07-11 22:46:55 得分 0
vc里找找控件Top
2 楼nevergrief(孤独骑士)回复于 2002-07-12 03:16:10 得分 10
// 例64 检测硬件设备
class CHardwareInfoDlg : public CDialog
{
public:
bool GetProcessorInfo();
bool GetMouseInfo();
void GetMemory();
MEMORYSTATUS mem;
}
bool CHardwareInfoDlg::GetProcessorInfo()
{
SYSTEM_INFO sysInfo;
char str [MAX_PATH];
// Get the hardware information
GetSystemInfo(&sysInfo);
// Lets check the processor type first
if (sysInfo.dwProcessorType == PROCESSOR_INTEL_386) {
m_stProcessorType = _T ("Intel 386");
}
else if (sysInfo.dwProcessorType == PROCESSOR_INTEL_486) {
m_stProcessorType = _T ("Intel 486");
}
else if (sysInfo.dwProcessorType == PROCESSOR_INTEL_PENTIUM) {
m_stProcessorType = _T ("Intel Pentium");
}
else if (sysInfo.dwProcessorType == PROCESSOR_MIPS_R4000) {
// only for NT
m_stProcessorType = _T ("MIPS");
}
else if (sysInfo.dwProcessorType == PROCESSOR_ALPHA_21064) {
// only for NT
m_stProcessorType = _T ("Alpha");
}
else {
m_stProcessorType = _T ("Unknown");
}
// check number of processors
itoa (sysInfo.dwNumberOfProcessors , str, 10);
m_stNumProcessors = CString (str);
// Check the architecture type and processor level
// Windows 95 doesn't use processor level
if (sysInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL) {
m_stArchitecture = _T ("Pentium");
switch (sysInfo.wProcessorLevel) {
case 3:
m_stProcessorLevel = _T ("Intel 80386");
break;
case 4:
m_stProcessorLevel = _T ("Intel 80486");
break;
case 5:
m_stProcessorLevel = _T ("Pentium");
// Check if the MMX instruction set is availbale or not.
if (IsProcessorFeaturePresent (PF_MMX_INSTRUCTIONS_AVAILABLE)) {
m_stProcessorLevel += _T (" MMX");
}
break;
case 6:
m_stProcessorLevel = _T ("Pentium (II/Pro)");
break;
}
}
else if (sysInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_MIPS) {
m_stArchitecture = _T ("MIPS");
if (sysInfo.wProcessorLevel == 0004) {
m_stProcessorLevel = _T ("MIPS R4000");
}
else {
m_stProcessorLevel = _T ("Unknown");
}
}
else if (sysInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_ALPHA) {
m_stArchitecture = _T ("Alpha");
itoa (sysInfo.wProcessorLevel , str, 10);
m_stProcessorLevel = m_stArchitecture + CString (str);
}
else if (sysInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_PPC) {
m_stArchitecture = _T ("PPC");
switch (sysInfo.wProcessorLevel) {
case 1:
m_stProcessorLevel = _T ("PPC 601");
break;
case 3:
m_stProcessorLevel = _T ("PPC 603");
break;
case 4:
m_stProcessorLevel = _T ("PPC 604");
break;
case 6:
m_stProcessorLevel = _T ("PPC 603+");
break;
case 9:
m_stProcessorLevel = _T ("PPC 604+");
break;
case 20:
m_stProcessorLevel = _T ("PPC 620");
break;
}
}
else if (sysInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_UNKNOWN) {
m_stArchitecture = _T ("Unknown");
}
// Check page size
itoa (sysInfo.dwPageSize , str, 10);
m_stPageSize = CString (str);
// Application address
TCHAR buffer [64];
sprintf( buffer, "%p", sysInfo.lpMaximumApplicationAddress);
m_stMaxAddress = _T ("0x") + CString (buffer);
sprintf( buffer, "%p", sysInfo.lpMinimumApplicationAddress);
m_stMinAdress = _T ("0x") + CString (buffer);
// Get active processor mask
// It represent how many processors are active (?? I am not sure)
itoa (sysInfo.dwActiveProcessorMask , str, 10);
m_stMask = CString (str);
UpdateData (FALSE);
return (true);
}
void CHardwareInfoDlg::GetMemory()
{
CString memstr;
::GlobalMemoryStatus(&mem);
memstr.Format("%d %s",mem.dwTotalPhys/(1024*1024),"M");
m_memstr=memstr;
UpdateData(FALSE);
}
bool CHardwareInfoDlg::GetMouseInfo()
{
int mouseInfo[3]; // We need an array (size 3) of int for mouse information
TCHAR str [32];
BOOL stat;
// Check if mouse is present or not.
stat = GetSystemMetrics (SM_MOUSEPRESENT);
if (!stat) {
m_stMouse = _T ("Not installed");
}
else {
m_stMouse = _T ("Installed");
// Check if buttons are swapped
stat = GetSystemMetrics (SM_SWAPBUTTON);
m_stButtonsSwapped = (stat) ? _T ("Swapped") : _T ("Not swapped");
}
// Get mouse speed
SystemParametersInfo (SPI_GETMOUSE, NULL, mouseInfo, NULL);
// mouseInfo [0] & mouseInfo [1], give twp threshold values for mouse
// mpuseInfo [2] gives the mouse speed.
sprintf (str, "%d", mouseInfo[2]);
m_stMouseSpeed = CString (str);
UpdateData (FALSE);
return (true);
}
注意,sp5后,估计可以检测更新的硬件了。比如p3,p4,实现后,请告我。谢谢!Top
3 楼miaoshu(智障大师)回复于 2002-07-12 10:18:52 得分 0
多谢各位指点。
不过还是有问题,如何得到显卡、声卡、主板、磁盘大小等信息呢?Top
4 楼yhb4(胖子)回复于 2002-07-12 10:41:07 得分 0
up,upTop
5 楼devil97518(天使也会疯)回复于 2002-07-12 10:51:37 得分 20
通过wmi或者dmi可以得到,即便是远程的计算机页可以控制得到,
具体作比较麻烦,有兴趣可以讨论的。
fp_dream@hotmail.comTop
6 楼sunrace516(sunrace516)回复于 2002-07-13 10:45:36 得分 0
用windows优化大师,可以看到非常详细的硬件信息,不用编程:)Top
7 楼jovian0999()回复于 2002-07-13 10:52:06 得分 0
gzTop
8 楼netface(一生何求?)回复于 2002-07-13 16:02:39 得分 0
我原来也提过同样的问题,但没有解决,GetSystemInfo得到的信息极其有限,而且只能识别到奔腾档次的电脑
gzTop
9 楼FlyingSch(BoyWithWings)回复于 2002-07-13 16:08:59 得分 10
给你获得CPU ID 和制造商的代码。你这几问题可能要问上一个月
DWORD dwId1,dwId2,dwId3,dwId4;
char szCompany[13];
PCHAR pCompany=szCompany;
CString strShow;
szCompany[12]=0;
_asm
{
pushfd
pushad
//Get CPU id
mov eax,1 //功能号
_emit 0x0f
_emit 0xa2
mov dwId1,eax
mov dwId2,ebx
mov dwId3,ecx
mov dwId4,edx
// get the company
mov edi,pCompany //功能号
mov eax,0
_emit 0x0f
_emit 0xa2
mov eax,ebx
stosd
mov eax,edx
stosd
mov eax,ecx
stosd
popad
popfd
}
strShow.Format("CPU ID %08X%08X%08X%08X\r\nCompany %s",dwId1,dwId2,dwId3,dwId4,szCompany);
MessageBox(strShow);Top
10 楼miaoshu(智障大师)回复于 2002-07-13 20:49:04 得分 0
汇编?!(吐血中......)
这个问题真的很难吗?本来还以为很简单。
不过这里高手这么多,应该会有办法的。
我顶!
Top
11 楼romanticist(桃花岛主--杭州)回复于 2002-07-15 09:36:54 得分 5
用 GetDeviceCaps 函数Top
12 楼yupeng1978(羽鹏)回复于 2002-07-15 09:42:17 得分 5
用GetSystemInfo具体查MSDNTop
13 楼yaotang(baobao)回复于 2002-07-16 09:27:15 得分 0
upTop
14 楼Free_Man(浪迹天涯)回复于 2002-07-16 09:40:26 得分 10
void CSysinfoDlg::OnMemory()
{
MEMORYSTATUS *mymem;
char s[6][20];
//获得系统内存情况
mymem = new MEMORYSTATUS;
GlobalMemoryStatus(mymem);
if(mymem->dwMemoryLoad>1024)
{
mymem->dwMemoryLoad/=1024;
_itoa(mymem->dwMemoryLoad,s[0],10);
m_usedmem=s[0];
m_usedmem+=" KB";
}
else
{
_itoa(mymem->dwMemoryLoad,s[0],10);
m_usedmem=s[0];
m_usedmem+=" Byte";
}
_itoa(mymem->dwTotalPhys/1024,s[1],10);
_itoa(mymem->dwTotalPageFile/1024,s[2],10);
_itoa(mymem->dwAvailPageFile/1024,s[3],10);
_itoa(mymem->dwTotalVirtual/1024,s[4],10);
_itoa(mymem->dwAvailVirtual/1024,s[5],10);
m_availvirtual.Format("%s KB",s[5]);
m_totalvirtual.Format("%s KB",s[4]);
m_totalpage.Format("%s KB",s[2]);
m_availpage.Format("%s KB",s[3]);
m_totalmem.Format("%s KB",s[1]);
UpdateData(FALSE);
delete mymem;
}
void CSysinfoDlg::OnDisk()
{
int drive;
CString disk[26],diskinfo;
CString scrxy;
//通过转换当前盘的方式测试磁盘
for( drive = 1; drive <= 26; drive++ )
if( !_chdrive( drive ) )
{
disk[drive].Format( "%c: ",drive + 'A' - 1 );
diskinfo = diskinfo + disk[drive];
}
m_Diskvol.SetWindowText(diskinfo);
//获得屏幕分辨率
int x = GetSystemMetrics(SM_CXSCREEN);
int y = GetSystemMetrics(SM_CYSCREEN);
scrxy.Format("%d * %d",x,y);
m_Scr.SetWindowText(scrxy);
}
void CSysinfoDlg::OnSystem()
{
// TODO: Add your control notification handler code here
char s[20];
LPSYSTEM_INFO mysys;
mysys=new SYSTEM_INFO;
GetSystemInfo(mysys);
_itoa(mysys->dwNumberOfProcessors,s,10);
m_cpunum=s;
_itoa(mysys->dwProcessorType,s,10);
m_cputype=s;
switch (mysys->wProcessorLevel)
{
case 3:
m_cpulevel="Intel 80386";
break;
case 4:
m_cpulevel="Intel 80486";
break;
case 5:
m_cpulevel="Pentium";
break;
default:
m_cpulevel="未知的CPU";
}
_itoa(mysys->wProcessorRevision,s,10);
m_cpurevision=s;
delete mysys;
UpdateData(FALSE);
}
void CSysinfoDlg::OnWinifo()
{
// TODO: Add your control notification handler code here
char windir[MAX_PATH];
//获得Windows目录
GetWindowsDirectory(windir,MAX_PATH);
m_Windir.SetWindowText(windir);
//获得Windows系统目录
GetSystemDirectory(windir,MAX_PATH);
m_Winsys.SetWindowText(windir);
//获得操作系统信息
OSVERSIONINFO osvi;
CString winver,os;
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx (&osvi);
switch(osvi.dwPlatformId)
{
case 0:
os = "Windows 3.x";
break;
case 1:
os = "Windows 95/98/Me";
break;
case 2:
os = "Windows NT/2000";
break;
}
winver.Format("Version:%d.%d Builder:%d",osvi.dwMajorVersion,osvi.dwMinorVersion,osvi.dwBuildNumber);
m_Winver.SetWindowText(winver);
m_Winplt.SetWindowText(os);
}
void CSysinfoDlg::OnCpu()
{
char s[20];
LPSYSTEM_INFO mysys;
mysys=new SYSTEM_INFO;
GetSystemInfo(mysys);
_itoa(mysys->dwNumberOfProcessors,s,10);
m_cpunum=s;
_itoa(mysys->dwProcessorType,s,10);
m_cputype=s;
switch (mysys->wProcessorLevel)
{
case 3:
m_cpulevel="Intel 80386";
break;
case 4:
m_cpulevel="Intel 80486";
break;
case 5:
m_cpulevel="Pentium";
break;
default:
m_cpulevel="未知的CPU";
}
_itoa(mysys->wProcessorRevision,s,10);
m_cpurevision=s;
delete mysys;
UpdateData(FALSE);
}
Top
15 楼miaoshu(智障大师)回复于 2002-07-16 14:18:51 得分 0
CPU、内存俺知道怎么得到了,可是剩下的问题。。。。。。
干脆,我这么问吧,怎么得到显卡的型号、声卡的型号、主板插槽数、磁盘容量?Top
16 楼Yings()回复于 2002-07-16 14:50:50 得分 40
用WMI吧!
去微软的网站down一个WMI的SDK,里边有一个例程看看就知道了。Top
17 楼miaoshu(智障大师)回复于 2002-07-17 11:32:39 得分 0
WMI果然好用,多谢各位关注和指教!Top



