【问题标题】:Determine Intel HD Graphics Card Version Via WinAPI通过 WinAPI 确定 Intel HD 显卡版本
【发布时间】:2016-06-19 17:37:53
【问题描述】:

所以我试图通过 WinAPI 函数获取有关显卡的信息,但对如何获取我的确切显卡信息有疑问。我已经编写了调用 EnumDisplayDevices 的代码,并通过我的调用收到了 DeviceString“Intel(R) HD Graphics Family”。但是,这并没有告诉我确切的卡,例如英特尔高清显卡系列有 4200、4400 等等(据我了解)。

我搜索了更多方法来查找此信息,甚至查看了注册表,但仍将我引导到“Intel(R) HD Graphics Family”的描述字符串......现在我在这里。非常感谢任何可以帮助我的人,它实际上是一个 stackoverflow 线程,它首先将我引向了 EnumDisplayDevices 的方向:)

【问题讨论】:

  • 型号是否暴露在您可以看到的 Windows 中的任何位置? (例如在设备管理器中?)。如果不是,它可能根本不会将该信息报告给操作系统。
  • 没有设备管理器给我相同的通用描述,没有确切的型号,我会试试 OpenGL。

标签: windows winapi graphics intel


【解决方案1】:

“驱动程序版本”的主要问题是视频驱动程序由多个组件组成,这些组件可能标记不同,您通过不同 API 获得的版本也可能不同。

也许直接的方法是使用SetupDiGetClassDevs(&GUID_DEVCLASS_DISPLAY, ... API 并枚举项目。这将为您提供与您在设备管理器中看到的数据相近的数据,其中的版本 - DEVPKEY_Device_DriverVersion 特别是使用 SetupDiGetDeviceRegistryProperty 值获得的。

如果你运行this utility,如果包含一个“显示设备”部分,上面提到了枚举,它确实提到了驱动程序版本:

显示设备

  • 英特尔(R) 高清显卡 4600
    • 实例:PCI\VEN_8086&DEV_0412&SUBSYS_85341043&REV_06\3&11583659&0&10
    • DEVPKEY_Device_Manufacturer:英特尔公司
    • DEVPKEY_Device_DriverVersion:20.19.15.4835
  • NVIDIA GeForce GTX 750
    • 实例:PCI\VEN_10DE&DEV_1381&SUBSYS_288B19DA&REV_A2\4&3834D97&0&0008
    • DEVPKEY_Device_Manufacturer:NVIDIA
    • DEVPKEY_Device_DriverVersion:23.21.13.8813

【讨论】:

    【解决方案2】:

    我会使用 OpenGL 而不是 WinAPI 因为我不知道 WinAPI 是否有这样的功能并且懒得研究.是的,您可以在注册表项中搜索此信息,但由于位置/名称可能发生变化,这在未来并不安全。 OpenGL 方法很简单:

    1. 创建 OpenGL 渲染上下文
    2. 获取适当的供应商和设备字符串。
    3. 发布 OpenGL 渲染上下文

    它适用于支持 OpenGL 1.0 的任何支持 OpenGL 的显卡/驱动程序,这些都是当今的显卡。

    您可以使用OpenGL函数glGetString获取此信息:

    GL_VENDOR Returns the company responsible for this OpenGL implementation. This name does not change from release to release.  
    GL_RENDERER Returns the name of the renderer. This name is typically specific to a particular configuration of a hardware platform. It does not change from release to release.  
    GL_VERSION Returns a version or release number (of supported OpenGL and gfx driver version)
    GL_EXTENSIONS Returns a space-separated list of supported extensions to OpenGL (all capabilities of your card)
    

    剩下的很简单(使用第二个链接中的gl_init,gl_exit):

    gl_init(Your_App_Window_Handle);
    char *vendor =(char*)glGetString(GL_VENDOR);
    char *device =(char*)glGetString(GL_RENDERER);
    char *version=(char*)glGetString(GL_VERSION);
    char *ext    =(char*)glGetString(GL_EXTENSIONS);
    gl_exit();
    

    矿山设置返回:

    vendor ="NVIDIA Corporation"
    device ="GeForce GTX 550 Ti/PCIe/SSE2"
    version="4.5.0 NVIDIA 347.25"
    ext    ="GL_AMD_multi_draw_indirect GL_ARB_arrays_of_arrays GL_ARB_base_instance GL_ARB_blend_func_extended GL_ARB_buffer_storage GL_ARB_clear_buffer_object GL_ARB_clear_texture GL_ARB_clip_control GL_ARB_color_buffer_float GL_ARB_compatibility GL_ARB_compressed_texture_pixel_storage GL_ARB_conservative_depth GL_ARB_compute_shader GL_ARB_compute_variable_group_size GL_ARB_conditional_render_inverted GL_ARB_copy_buffer GL_ARB_copy_image GL_ARB_cull_distance GL_ARB_debug_output GL_ARB_depth_buffer_float GL_ARB_depth_clamp GL_ARB_depth_texture GL_ARB_derivative_control GL_ARB_direct_state_access GL_ARB_draw_buffers GL_ARB_draw_buffers_blend GL_ARB_draw_indirect GL_ARB_draw_elements_base_vertex GL_ARB_draw_instanced GL_ARB_enhanced_layouts GL_ARB_ES2_compatibility GL_ARB_ES3_compatibility GL_ARB_ES3_1_compatibility GL_ARB_explicit_attrib_location GL_ARB_explicit_uniform_location GL_ARB_fragment_coord_conventions GL_ARB_fragment_layer_viewport GL_ARB_fragment_program GL_ARB_fragment_program_shadow GL_ARB_fragment_shader GL_ARB_framebuffer_no_attachments GL_ARB_framebuffer_object GL_ARB_framebuffer_sRGB GL_ARB_geometry_shader4 GL_ARB_get_program_binary GL_ARB_get_texture_sub_image GL_ARB_gpu_shader5 GL_ARB_gpu_shader_fp64 GL_ARB_half_float_pixel GL_ARB_half_float_vertex GL_ARB_imaging GL_ARB_indirect_parameters GL_ARB_instanced_arrays GL_ARB_internalformat_query GL_ARB_internalformat_query2 GL_NV_internalformat_sample_query GL_ARB_invalidate_subdata GL_ARB_map_buffer_alignment GL_ARB_map_buffer_range GL_ARB_multi_bind GL_ARB_multi_draw_indirect GL_ARB_multisample GL_ARB_multitexture GL_ARB_occlusion_query GL_ARB_occlusion_query2 GL_ARB_pipeline_statistics_query GL_ARB_pixel_buffer_object GL_ARB_point_parameters GL_ARB_point_sprite GL_ARB_program_interface_query GL_ARB_provoking_vertex GL_ARB_robust_buffer_access_behavior GL_ARB_robustness GL_ARB_sample_shading GL_ARB_sampler_objects GL_ARB_seamless_cube_map GL_ARB_separate_shader_objects GL_ARB_shader_atomic_counters GL_ARB_shader_bit_encoding GL_ARB_shader_draw_parameters GL
    

    [备注]

    您只需要包含gl.h,不需要glu,glew 或其他任何内容(wglext.h 除外,它应该单独包含在gl.h 中)。它通常位于单独的包含子目录中,例如:

    #include <gl\gl.h>
    

    [编辑1]

    由于英特尔 OpenGL 实现也没有公开版本,因此我只看到了一个其他选项。您需要获取卡的 PCI ID VID/PID 并与已知值进行交叉检查:

    Model               CPU arch.       Release date    PCI ID      Execution units
    HD Graphics         Arrandale               2010    8086:0046   6
    HD Graphics         Sandy Bridge    January 2011    8086:0106   6
    HD Graphics 2000    Sandy Bridge    January 2011    8086:0102   6
    HD Graphics 3000    Sandy Bridge    January 2011    8086:0116   16
    HD Graphics 2500    Ivy Bridge      April 2012      8086:016A   6
    HD Graphics 4000    Ivy Bridge      April 2012      8086:0166   16
    HD Graphics 4400    Haswell               2013                  20
    HD Graphics 4600    Haswell               2013      8086:0416   20
    HD Graphics 5500    Broadwell             2015                  24
    

    取自here

    要获取 PCI ID,您可以使用:

    只需将解析字符串从 TEXT("USB") 更改为 TEXT("PCI") 并检查 VID 8086 设备,因此:

    bool PCIinfo()
        {
        int i,n;
        AnsiString s,txt="";
        DWORD dwSize,dwPropertyRegDataType;
        HDEVINFO hDevInfo;
        SP_DEVINFO_DATA DeviceInfoData;
        TCHAR szDesc[1024];
    
    //  hDevInfo = SetupDiGetClassDevs(NULL, NULL       , NULL, DIGCF_PRESENT|DIGCF_ALLCLASSES);    // List all devices
    //  hDevInfo = SetupDiGetClassDevs(NULL, TEXT("USB"), NULL, DIGCF_PRESENT|DIGCF_ALLCLASSES);    // List all connected USB devices
        hDevInfo = SetupDiGetClassDevs(NULL, TEXT("PCI"), NULL, DIGCF_PRESENT|DIGCF_ALLCLASSES);    // List all connected PCI devices
    
        if (hDevInfo == INVALID_HANDLE_VALUE) return false;
        // Find the ones that are driverless
        for (i=0;;i++)
            {
            DeviceInfoData.cbSize = sizeof(DeviceInfoData);
            if (!SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData)) break;
            SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_DEVICEDESC,&dwPropertyRegDataType, (BYTE*)szDesc,sizeof(szDesc),&dwSize);
            s=szDesc; n=48; while (s.Length()<n) s+=" "; if (s.Length()>n) s=s.SubString(1,n); txt+=s+" ";
            SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_HARDWAREID,&dwPropertyRegDataType, (BYTE*)szDesc,sizeof(szDesc),&dwSize);
            s=szDesc; n=64; while (s.Length()<n) s+=" "; if (s.Length()>n) s=s.SubString(1,n); txt+=s+" ";
            SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_LOCATION_INFORMATION,&dwPropertyRegDataType, (BYTE*)szDesc,sizeof(szDesc),&dwSize);
            s=szDesc; n=40; while (s.Length()<n) s+=" "; if (s.Length()>n) s=s.SubString(1,n); txt+=s+" ";
            txt+="\r\n";
            }
        Main->mm_log->Lines->Add(txt);
        return true;
        }
    

    该代码在我的设置中返回:

    PCI standard host CPU bridge                     PCI\VEN_1022&DEV_1400&SUBSYS_00000000&REV_00                     PCI bus 0, device 24, function 0         
    PCI standard host CPU bridge                     PCI\VEN_1022&DEV_1401&SUBSYS_00000000&REV_00                     PCI bus 0, device 24, function 1         
    PCI standard host CPU bridge                     PCI\VEN_1022&DEV_1402&SUBSYS_00000000&REV_00                     PCI bus 0, device 24, function 2         
    PCI standard host CPU bridge                     PCI\VEN_1022&DEV_1403&SUBSYS_00000000&REV_00                     PCI bus 0, device 24, function 3         
    PCI standard host CPU bridge                     PCI\VEN_1022&DEV_1404&SUBSYS_00000000&REV_00                     PCI bus 0, device 24, function 4         
    PCI standard host CPU bridge                     PCI\VEN_1022&DEV_1405&SUBSYS_00000000&REV_00                     PCI bus 0, device 24, function 5         
    PCI standard host CPU bridge                     PCI\VEN_1022&DEV_1410&SUBSYS_14101022&REV_00                     PCI bus 0, device 0, function 0          
    PCI Express standard Root Port                   PCI\VEN_1022&DEV_1412&SUBSYS_12341022&REV_00                     PCI bus 0, device 2, function 0          
    PCI Express standard Root Port                   PCI\VEN_1022&DEV_1414&SUBSYS_12341022&REV_00                     PCI bus 0, device 4, function 0          
    PCI Express standard Root Port                   PCI\VEN_1022&DEV_1417&SUBSYS_12341022&REV_00                     PCI bus 0, device 7, function 0          
    AMD IOMMU Device                                 PCI\VEN_1022&DEV_1419&SUBSYS_14191022&REV_00                     PCI bus 0, device 0, function 2          
    AMD SATA Controller                              PCI\VEN_1022&DEV_7801&SUBSYS_B0021458&REV_40                     PCI bus 0, device 17, function 0         
    Standard OpenHCD USB Host Controller             PCI\VEN_1022&DEV_7807&SUBSYS_50041458&REV_11                     PCI bus 0, device 18, function 0         
    Standard OpenHCD USB Host Controller             PCI\VEN_1022&DEV_7807&SUBSYS_50041458&REV_11                     PCI bus 0, device 19, function 0         
    Standard Enhanced PCI to USB Host Controller     PCI\VEN_1022&DEV_7808&SUBSYS_50041458&REV_11                     PCI bus 0, device 18, function 2         
    Standard Enhanced PCI to USB Host Controller     PCI\VEN_1022&DEV_7808&SUBSYS_50041458&REV_11                     PCI bus 0, device 19, function 2         
    Standard OpenHCD USB Host Controller             PCI\VEN_1022&DEV_7809&SUBSYS_50041458&REV_11                     PCI bus 0, device 20, function 5         
    AMD SMBus                                        PCI\VEN_1022&DEV_780B&SUBSYS_780B1022&REV_14                     PCI bus 0, device 20, function 0         
    High Definition Audio Controller                 PCI\VEN_1022&DEV_780D&SUBSYS_A0021458&REV_01                     PCI bus 0, device 20, function 2         
    PCI standard ISA bridge                          PCI\VEN_1022&DEV_780E&SUBSYS_780E1022&REV_11                     PCI bus 0, device 20, function 3         
    PCI standard PCI-to-PCI bridge                   PCI\VEN_1022&DEV_780F&SUBSYS_00000000&REV_40                     PCI bus 0, device 20, function 4         
    AMD USB 3.0 Host Controller                      PCI\VEN_1022&DEV_7812&SUBSYS_50041458&REV_03                     PCI bus 0, device 16, function 0         
    AMD USB 3.0 Host Controller                      PCI\VEN_1022&DEV_7812&SUBSYS_50041458&REV_03                     PCI bus 0, device 16, function 1         
    High Definition Audio Controller                 PCI\VEN_10DE&DEV_0BEE&SUBSYS_35371458&REV_A1                     PCI bus 1, device 0, function 1          
    NVIDIA GeForce GTX 550 Ti                        PCI\VEN_10DE&DEV_1244&SUBSYS_35371458&REV_A1                     PCI bus 1, device 0, function 0          
    Realtek PCIe GBE Family Controller               PCI\VEN_10EC&DEV_8168&SUBSYS_E0001458&REV_06                     PCI bus 2, device 0, function 0          
    MSI TV@Anywhere Plus                             PCI\VEN_1131&DEV_7133&SUBSYS_62311462&REV_D1                     PCI bus 4, device 6, function 0          
    Etron USB 3.0 Extensible Host Controller         PCI\VEN_1B6F&DEV_7023&SUBSYS_50071458&REV_01                     PCI bus 3, device 0, function 0          
    

    所以在不同的 IntelHD 图形计算机上运行它并检查是否存在不同的 PCI ID ...

    【讨论】:

    • 我会检查 OpenGL 并看看它是如何运行的,如果它成功了,我会接受这个作为答案。非常感谢您提供的所有信息!
    • @MazerRackham 使用另一种方法查看 edit1。我现在无法访问 Intel HD(也没有 2 个不同的,因为我的 12 岁以上的旧笔记本电脑已成碎片)所以我无法正确检查。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    相关资源
    最近更新 更多