所以我试图通过WinAPI功能获取有关显卡的信息,但是有关如何获取我的确切卡信息的问题。我编写了调用EnumDisplayDevices的代码,通过我的调用,我收到了DeviceString“Intel(R)HD Graphics Family”。然而,这并没有告诉我确切的卡,例如英特尔高清显卡系列有4200,4400等等(根据我的理解)。
我更多地搜索了查找此信息的方法,甚至通过注册表查看,这仍然让我找到了“Intel(R)HD Graphics Family”的描述字符串......现在我在这里。非常感谢任何可以帮助我的人,它实际上是一个stackoverflow线程,它首先引导我向EnumDisplayDevices方向发展:)
答案 0 :(得分:1)
我会使用 OpenGL 代替 WinAPI ,因为我不知道 WinAPI 是否还有一些像这样的功能而且懒得研究。是的,您可以搜索注册表项以获取此信息,但由于可能的位置/名称更改,将来不安全。 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>
。它通常位于单独的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