Получить имя видеокарты на c (Windows)

#c #winapi

#c #winapi

Вопрос:

Мне нужно получить информацию о видеокарте, установленной в Windows. Имя видеокарты. Как я могу это сделать? Могу ли я использовать Windows API? Пожалуйста, предоставьте несколько примеров.

Комментарии:

1. Для этого вы можете использовать Direct3D API в Windows.

2. learn.microsoft.com/en-us/windows/desktop/cimwin32prov/…

Ответ №1:

Приведенный ниже код поможет получить имя видеокарты

 #define _WIN32_DCOM
#include <iostream>
#include <tchar.h>
#include <comdef.h>
#include <Wbemidl.h>
# pragma comment(lib, "wbemuuid.lib")

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    HRESULT hres;
    hres =  CoInitializeEx(0, COINIT_MULTITHREADED);
    if (FAILED(hres)) return 0;
    hres =  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);
    if (FAILED(hres)) {
        CoUninitialize();
        return 0;
    }
    IWbemLocator *pLoc = NULL;
    hres = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) amp;pLoc);
    if (FAILED(hres)) {
        CoUninitialize();
        return 0;
    }
    IWbemServices *pSvc = NULL;
    hres = pLoc->ConnectServer( _bstr_t(L"root\CIMV2"), NULL, NULL, 0, NULL, 0, 0, amp;pSvc);
    if (FAILED(hres)) {
        pLoc->Release();
        CoUninitialize();
        return 0;
    }
    hres = CoSetProxyBlanket(pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE);
    if (FAILED(hres)) {
        pSvc->Release();
        pLoc->Release();
        CoUninitialize();
        return 0;
    }
    IEnumWbemClassObject* pEnumerator = NULL;
    hres = pSvc->ExecQuery(bstr_t("WQL"),
                           bstr_t("SELECT * FROM Win32_VideoController"),
                           WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, amp;pEnumerator);
    if (FAILED(hres)) {
        pSvc->Release();
        pLoc->Release();
        CoUninitialize();
        return 0;
    }
    IWbemClassObject *pclsObj;
    ULONG uReturn = 0;
    while(pEnumerator)
    {
        HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, amp;pclsObj, amp;uReturn);
        if(0 == uReturn)break;
        VARIANT vtProp;
        hr = pclsObj->Get(L"Caption", 0, amp;vtProp, 0, 0);
        wcout << " OS Name : " << vtProp.bstrVal << endl;
        VariantClear(amp;vtProp);
    }
    pSvc->Release();
    pLoc->Release();
    pEnumerator->Release();
    pclsObj->Release();
    CoUninitialize();

    return 0;
}
  

compile: cl.exe /EHsc main.cpp
output: OS Name : Intel(R) HD Graphics 520

Ответ №2:

Решение, основанное исключительно на GDI, будет использовать EnumDisplayDevices . Следующий код выполняется в онлайн-компиляторе c .

 //Microsoft (R) C/C   Optimizing Compiler Version 19.00.23506 for x64

#include <iostream>
#include <windows.h>
#pragma comment(lib,"user32.lib")

int main()
{
    for(int i=0; ;i  )
    {
        DISPLAY_DEVICE dd = {sizeof(dd), 0};
        BOOL f = EnumDisplayDevices(NULL,i,amp;dd,EDD_GET_DEVICE_INTERFACE_NAME);
        if(!f)
            break;

        std::cout << dd.DeviceString;
        std::cout << "rn"; 
    }
 }
  

Комментарии:

1. Не работает через RDP (удаленный рабочий стол).