显示器的厂家和型号,以及显示器的一些基本的显示特性和能力,比如尺寸是17寸,21寸,是CRT,还是LCD,等等;
显卡的厂家和型号,显卡的一些基本的显示特性和能力,比如显卡内部的DAC转换表是8位还是10位的,等等;
还有CPU,内存,
请问有没有什么比较容易的方法。请给段MSVC WIN32API或者MFC程序。非常感谢。

解决方案 »

  1.   

    获取显存大小:#include <ddraw.h>#pragma comment(lib, "guids.lib") LPDIRECTDRAW2 lpdd;
    HRESULT ddrval;

    CoInitialize(NULL);

    ddrval = CoCreateInstance(CLSID_DirectDraw,
    NULL, CLSCTX_ALL, IID_IDirectDraw2, (void**)&lpdd);


    if(!FAILED(ddrval))
    {
    ddrval = IDirectDraw2_Initialize(lpdd, NULL);
    }

    DDCAPS ddcaps;

    ddcaps.dwSize = sizeof DDCAPS;
    lpdd->GetCaps(&ddcaps, NULL);

    lpdd->Release();

    DWORD dwMem = ddcaps.dwVidMemTotal; int iMem = dwMem/1024/1024; CString strMem;
    strMem.Format(_T("display memory is %d MB"),iMem); AfxMessageBox(strMem);

    CoUninitialize();
      

  2.   

    http://community.csdn.net/Expert/topic/3248/3248633.xml?temp=.5899011
      

  3.   

    可以查注册表
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum 有所有信息
      

  4.   

    //给你我写的一个完整类:
    /*
    GetCurComputerInfo.h
    */
    #ifndef __GETCURCOMPUTERINFO_H__
    #define __GETCURCOMPUTERINFO_H__//CCurComputerInfo Class
    #define MAXBUFSIZE 2000
    class CGetCurComputerInfo
    {
    public:
    CGetCurComputerInfo();
    ~CGetCurComputerInfo();

    char* GetCurComputerName(char* szPCName, char* szRetCode);
    char* GetCurUserName(char* szUserName, char* szRetCode);
    char* GetCurOSVer(char* szOSVer, char* szRetCode);
    char* GetCurCPUInfo(char* szCPUInfo, char* szRetCode);
    char* GetCurMemSize(char* szMemSize);

    protected:
    BOOL GetOSVersion(char* szOSVer);
    char* Trim(char* pStr);

    private:
    DWORD dwSize;

    };#endif  //~__GETCURCOMPUTERINFO_H__
    /*
    GetCurComputerInfo.h
    */
    #include "GetCurComputerInfo.h"
    //Implementation of Class CGetCurComputerInfo
    CGetCurComputerInfo::CGetCurComputerInfo()
    {
    dwSize = 256;
    }CGetCurComputerInfo::~CGetCurComputerInfo()
    {
    }char* CGetCurComputerInfo::GetCurComputerName(char* szPCName, char* szRetCode)
    {
    BOOL  bRet; if (szPCName == NULL || szRetCode == NULL) 
    {
    return NULL;
    } bRet = GetComputerName(szPCName, &dwSize);
    if (!bRet) 
    {
    sprintf(szRetCode, "GetComputerName failed: %d", GetLastError());
    return szRetCode;
    } return szPCName;
    }char* CGetCurComputerInfo::GetCurUserName(char* szUserName, char* szRetCode)
    {
    BOOL  bRet;  
    DWORD cchBuff = 256; if (szUserName == NULL || szRetCode == NULL) 
    {
    return NULL;
    }

    //the second para cannot use &dwSize: why?
    bRet = GetUserName(szUserName, &cchBuff);
    if (!bRet) 
    {
    sprintf(szRetCode, "GetUserName failed: %d", GetLastError());
    return szRetCode;
    }

    return szUserName;
    }
    BOOL CGetCurComputerInfo::GetOSVersion(char* szOSVer)
    {
       OSVERSIONINFOEX osvi;
       BOOL bOsVersionInfoEx;
       char szBuf[MAXBUFSIZE];   // Try calling GetVersionEx using the OSVERSIONINFOEX structure.
       //
       // If that fails, try using the OSVERSIONINFO structure.   if (szOSVer == NULL) 
       {
       return FALSE;
       }   ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
       osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);   if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) )
       {
          // If OSVERSIONINFOEX doesn't work, try OSVERSIONINFO.      osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
          if (! GetVersionEx ( (OSVERSIONINFO *) &osvi) ) 
             return FALSE;
       }   switch (osvi.dwPlatformId)
       {
          case VER_PLATFORM_WIN32_NT:      // Test for the product.         if ( osvi.dwMajorVersion <= 4 )
                sprintf(szOSVer, "Microsoft Windows NT ");         if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 )
                sprintf(szOSVer, "Microsoft Windows 2000 ");         if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 )
                sprintf(szOSVer, "Microsoft Windows XP ");      // Test for product type.
    /*
             if( bOsVersionInfoEx )
             {
                if ( osvi.wProductType == VER_NT_WORKSTATION )
                {
                   if( osvi.wSuiteMask & VER_SUITE_PERSONAL )
                      printf ( "Personal " );
                   else
                      printf ( "Professional " );
                }            else if ( osvi.wProductType == VER_NT_SERVER )
                {
                   if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
                      printf ( "DataCenter Server " );
                   else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
                      printf ( "Advanced Server " );
                   else
                      printf ( "Server " );
                }
             }
             else
    */         {
                HKEY hKey;
                char szProductType[80];
                DWORD dwBufLen;            RegOpenKeyEx( HKEY_LOCAL_MACHINE,
                   "SYSTEM\\CurrentControlSet\\Control\\ProductOptions",
                   0, KEY_QUERY_VALUE, &hKey );
                RegQueryValueEx( hKey, "ProductType", NULL, NULL,
                   (LPBYTE) szProductType, &dwBufLen);
                RegCloseKey( hKey );
                if ( lstrcmpi( "WINNT", szProductType) == 0 )
                   strcat(szOSVer, "Professional " );
                if ( lstrcmpi( "LANMANNT", szProductType) == 0 )
                   strcat(szOSVer, "Server " );
                if ( lstrcmpi( "SERVERNT", szProductType) == 0 )
                   strcat(szOSVer, "Advanced Server " );
             }      // Display version, service pack (if any), and build number.         if ( osvi.dwMajorVersion <= 4 )
             {
       sprintf(szBuf, "version %d.%d %s (Build %d)\n",
                   osvi.dwMajorVersion,
                   osvi.dwMinorVersion,
                   osvi.szCSDVersion,
                   osvi.dwBuildNumber & 0xFFFF);    strcat(szOSVer, szBuf);
             }
             else
             { 
                sprintf(szBuf, "%s (Build %d)\n",
                   osvi.szCSDVersion,
                   osvi.dwBuildNumber & 0xFFFF); strcat(szOSVer, szBuf);
             }
             break;      case VER_PLATFORM_WIN32_WINDOWS:         if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0)
             {
                 sprintf(szOSVer, "Microsoft Windows 95 ");
                 if ( osvi.szCSDVersion[1] == 'C' || osvi.szCSDVersion[1] == 'B' )
                    strcat(szOSVer, "OSR2 " );
             }          if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10)
             {
                 sprintf(szOSVer, "Microsoft Windows 98 ");
                 if ( osvi.szCSDVersion[1] == 'A' )
                    strcat(szOSVer, "SE " );
             }          if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90)
             {
                 sprintf(szOSVer, "Microsoft Windows Me ");
             } 
             break;      case VER_PLATFORM_WIN32s:         sprintf(szOSVer, "Microsoft Win32s ");
             break;
       }   return TRUE; 
    }
    char* CGetCurComputerInfo::GetCurOSVer(char* szOSVer, char* szRetCode)
    {
    BOOL  bRet; if (szOSVer == NULL || szRetCode == NULL) 
    {
    return NULL;
    }

    bRet = GetOSVersion(szOSVer);
    if (!bRet) 
    {
    sprintf(szRetCode, "GetUserName failed: %d", GetLastError());
    return szRetCode;
    }

    return szOSVer;
    }char* CGetCurComputerInfo::GetCurMemSize(char* szMemSize)
    {
    MEMORYSTATUS msStat;

    if (szMemSize == NULL) 
    {
    return NULL;
    }

    GlobalMemoryStatus (&msStat); sprintf(szMemSize, "%ldKB Free/%ldKB Total(Physical)", msStat.dwAvailPhys/1024, msStat.dwTotalPhys/1024);

    return szMemSize;
    }char* CGetCurComputerInfo::GetCurCPUInfo(char* szCPUInfo, char* szRetCode)
    {
    HKEY hKey;
    LPCTSTR lpSubkey =  "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0";
    BYTE bBuf[100];
    DWORD dwBufSize = 100;  
    DWORD dwType = REG_SZ;
    long  lRet; ZeroMemory(bBuf, sizeof(bBuf));

    lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpSubkey, 0, KEY_READ, &hKey);
    if (lRet != ERROR_SUCCESS) 
    {
    sprintf(szRetCode, "RegOpenKeyEx Failed: %d", GetLastError());
    return szRetCode;
    } lRet = RegQueryValueEx(hKey, "ProcessorNameString", NULL, &dwType, bBuf, &dwBufSize);
    if (lRet != ERROR_SUCCESS) 
    {
    sprintf(szRetCode, "RegQueryValueEx Failed: %d", GetLastError());
    RegCloseKey(hKey);
    return szRetCode;
    } sprintf(szCPUInfo, "%s", bBuf);
    Trim(szCPUInfo); RegCloseKey(hKey);
    return szCPUInfo;
    }char* CGetCurComputerInfo::Trim(char* pStr)
    {
    char* pBegin;
    char* pEnd;
    long len;

    if (pStr == NULL)
    {
    return NULL;
    }
    len=strlen(pStr);
    if(len<=0)
    {
    return pStr;
    }

    pBegin = pStr;
    pEnd = pStr + len - 1;

    while (isspace(*pBegin) && *pBegin != '\0')
    pBegin ++;

    while (isspace(*pEnd) && pEnd > pBegin)
    pEnd --;

    len = pEnd - pBegin + 1;
    strncpy(pStr, pBegin, len);
    pStr[len] = '\0';

    return pStr;
    }//Implementation of CGetCurComputerInfo end
      

  5.   

    小三大侠的查询注册表究竟怎样进行呀?楼上的完整类真的很好,但是怎么样设置MSVC .NET 2002英文版来使用呢?使用MFC,还是ATL,还是普通的WIN32?请能否给出项目文件呢?
      

  6.   

    VC访问注册表访问注册表编程的基本框架
    ======================== 
    //声明 HEKY hk;
    //Step 1 打开注册表的具体键RegOpenKeyEx 
    //Step 2 对注册表操作,RegQueryValueEx,RegSetValueEx................. 
    //关闭 ::RegCloseKey(hk); 前期准备 
    ======== 声明方法: HEKY hk;
    //可以换你喜欢的变量,MD说了一句废话 关于键的值的类型: 就是下面的 data_Get 的类型是 LPCTSTR 关于返回值: 例如下面的 ret0 可以通过ERROR_SUCCESS判断,大家可以看下面的示例代码 关于调用的API的参数问题:不要客气,打开MSDN,写得很清楚明白。访问注册表数据的例子 
    ==================== 
    //---------------------------------------------------------------- 
    //获取WIN98版本 
    //---------------------------------------------------------------- HKEY hk; LPCTSTR data_Get="Software\\Microsoft\\Windows\\CurrentVersion";//在注册表里的位置 long ret0=::RegOpenKeyEx(HKEY_LOCAL_MACHINE, 
    //根 data_Get, 0, 
    //必须为0,保留 KEY_READ, 
    //安全访问屏蔽字,具体见MSDN,列出了所有的值 &hk); 
    //通过ERROR_SUCCESS判断打开是否成功。 if(ret0!=ERROR_SUCCESS) MessageBox("打开注册表出现错误!","错误"); LPBYTE win_version=new BYTE[80];DWORD type=REG_SZ;DWORD cbData=80; long ret1=::RegQueryValueEx(hk,"VersionNumber",
    //请求得到的键的名称NULL,
    //保留,必须为NULL&type,
    //值的类型,具体见MSDNwin_version,
    //接受值的缓冲区 &cbData);
    //缓冲区大小if(ret1!=ERROR_SUCCESS){ MessageBox("读取注册表键值出现错误!","错误"); } CString str_winversion=CString(win_version); delete[] win_version;::RegCloseKey(hk);
    //----------------------------------------------------------------
    用API访问注册表就是一段套话,大家可以按照我的框架来写自己的访问注册表的代码。在进行VC编程的时候要有MSDN,在改写注册表的时候要先备份你的注册表。
    在MFC中访问注册表
    =================
    MFC在类CWinApp里提供了一个成员函数SetRegistryKey(),调用它后就可以用访问.ini文件的成员函数访问注册表了。CWinApp::SetRegistryKey() 格式:void SetRegistryKey(LPCTSTR lpszRegistryKey);lpszRegistryKey 的含义:HKEY_CURRENT_USER\SoftWare 下的子键名称。调用后下面的函数就可以访问注册表了。CWinApp::GetProfileInt(...) CWinApp::GetProfileString(...) CWinApp::WriteProfileInt(...) CWinApp::WriteProfileString(...)例子:
    //---------------------------------------------------------------- 
    //在HKEY_CURRENT_USER\SoftWare下建立mykey主键,然后在它下面建立串 
    //值my_string_value 和 DWORD 键值 my_int_value 
    //---------------------------------------------------------------- CString strKey=mykey; CString strStringItem=my_string_value; CString strIntItem=my_int_value; CWinApp* pApp=AfxGetApp();pApp->SetRegistryKey(strkey);pApp->WriteProfileString(strKey,strStringItem,hello);CString strValue;strValue=pApp->GetProfileString(strKey,strStringItem,"默认值");ASSERT(strValue==test);int nValue;nValue=pApp->GetProfileInt(strKey,strIntItem,0); ASSERT(nValue==1111); 
    //End That's all.--
      

  7.   

    显示器的一些基本的显示特性和能力,比如尺寸是17寸,21寸,是CRT,还是LCD,等等;厉害厉害....
    我顶:)