通过WinAPI确定英特尔高清显卡版本

时间:2016-03-06 02:07:01

标签: windows winapi graphics intel

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

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

2 个答案:

答案 0 :(得分:1)

我会使用 OpenGL 代替 WinAPI ,因为我不知道 WinAPI 是否还有一些像这样的功能而且懒得研究。是的,您可以搜索注册表项以获取此信息,但由于可能的位置/名称更改,将来不安全。 OpenGL 方式很简单:

  1. 创建 OpenGL 渲染上下文
  2. 获取适当的供应商和设备字符串。
  3. 发布 OpenGL 呈现上下文
  4. 它适用于支持 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> 。它通常位于单独的include子目录中,如:

    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
    

    <强> [EDIT1]

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

    TEXT("USB")

    取自here

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

    只需将解析字符串从TEXT("PCI")更改为8086,然后检查 VID 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          
    

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

    $PSBoundParameters

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

答案 1 :(得分:0)

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

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

如果您运行this utility,则包含一个部分&#34;显示设备&#34;如上所述的枚举,它确实提到了驱动程序版本:

  

显示设备

     
      
  • 英特尔(R)HD Graphics 4600      
        
    • 实例:PCI \ VEN_8086&amp; DEV_0412&amp; SUBSYS_85341043&amp; REV_06 \ 3&amp; 11583659&amp; 0&amp; 10
    •   
    • DEVPKEY_Device_Manufacturer:Intel Corporation
    •   
    • DEVPKEY_Device_DriverVersion: 20.19.15.4835 &lt;&lt; -----------------------
    •   
  •   
  • NVIDIA GeForce GTX 750      
        
    • 实例:PCI \ VEN_10DE&amp; DEV_1381&amp; SUBSYS_288B19DA&amp; REV_A2 \ 4&amp; 3834D97&amp; 0&amp; 0008
    •   
    • DEVPKEY_Device_Manufacturer:NVIDIA
    •   
    • DEVPKEY_Device_DriverVersion:23.21.13.8813
    •   
  •