You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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ć

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 13:27:07