Windows下枚举GPU所有显示输出接口(含未连接状态)
枚举GPU所有显示输出接口(含未连接接口)的Windows通用方案
我需要枚举并显示GPU上的显示输出接口信息,即使接口未连接设备也能获取。
例如我的GPU输出如下:
Connector 0: HDMI
Connector 1: DisplayPort
Connector 2: DisplayPort
Connector 3: DisplayPort
我尝试过以下方法,但都存在问题:
- 使用
SetupApi,未找到任何关于接口/输出的信息; - 使用
EnumDisplayDevices()和EnumDisplayMonitors(),但仅返回已连接的显示器; DXGI在我的测试中也仅列出已连接的显示器;- 使用
QueryDisplayConfig()并传入QDC.QDC_ALL_PATHS会返回大量路径,其中部分结果不符合实际(比如返回我的GPU没有的DVI接口),或许需要进行过滤?
是否可以在Windows系统上不依赖GPU厂商专属库实现该功能?
补充说明:我发现Dxgkddi中的Windows显示驱动模型有查询适配器子设备(即GPU显示输出)以创建视频呈现网络拓扑的方法,但我需要开发应用而非驱动,因此需要更高层级的API。
补充说明2:以下是基于NVAPI的实现代码,我需要类似的、不依赖厂商的实现方案,要求支持Windows 10及以上系统的所有GPU。
#include <Windows.h> #include "NVGetOutputs.h" #include <nvapi.h> #include <iostream> void NV_Outputs::getOutputs() { NvU32 displayIdCount = NVAPI_MAX_DISPLAYS; NV_GPU_DISPLAYIDS displayIds[NVAPI_MAX_DISPLAYS] = { 0 }; displayIds->version = NV_GPU_DISPLAYIDS_VER; NvU32 gpuCount = 0; NvPhysicalGpuHandle gpuHandles[NVAPI_MAX_PHYSICAL_GPUS] = { 0 }; NvAPI_Status status = NvAPI_Initialize(); if (status != NVAPI_OK) { return; } status = NvAPI_EnumPhysicalGPUs(gpuHandles, &gpuCount); if (status != NVAPI_OK || gpuCount < 1) { NvAPI_Unload(); return; } NvPhysicalGpuHandle gpuHandle = gpuHandles[0]; if (gpuHandle == 0) { NvAPI_Unload(); return; } status = NvAPI_GPU_GetAllDisplayIds(gpuHandle, displayIds, &displayIdCount); if (status != NVAPI_OK) { NvAPI_Unload(); return; } char* types[] = { "UNINITIALIZED", "VGA", "COMPONENT", "SVIDEO", "HDMI", "DVI", "LVDS", "DISPLAY PORT", "COMPOSITE", "UNKNOWN" }; int connector = 0; for (NvU32 i = 0; i < displayIdCount; ++i) { if (displayIds[i].isOSVisible) { std::cout << "Output " << (i+1) << " on Port " << ++connector << ":" << std::endl << " Type : " << types[displayIds[i].connectorType] << std::endl << " Connected : " << displayIds[i].isConnected << std::endl << std::endl; } } NvAPI_Unload(); }
内容的提问来源于stack exchange,提问作者Marino Šimić
相关产品推荐
相关产品推荐

