(WMI) 我如何知道哪个显示器连接到哪个图形卡? (C++ 或 C#)

(WMI) How do I know which monitor is connected to which graphics card? (c++ or c#)

我可以用Win32_DesktopMonitor查询所有显示器,用Win32_VideoController查询所有显卡,但我怎么知道哪个显示器连接哪个显卡?

假设我使用 Win32_VideoController 获得两个桌面分辨率,19201080 和 1600900。我有两台显示器,戴尔和惠普。我怎么知道哪个显示器有哪个分辨率?

使用Win32_DesktopMonitor我可以获得ScreenWidth和ScreenHeight,但是如果驱动程序不支持WDDM,这两个值将不存在。而且即使我获得了分辨率,我也无法获得更多信息,例如 Win10 设置。我怎么知道Dell连接的是Display1,VE连接的是Display2?

How could I know that Dell is connected to Display1 and VE is connected to Display2?

EnumDisplayMonitors 看来是你需要的。

一个简单的C++代码示例,

#include <Windows.h>
#include <iostream>
#include <vector>
#include <cstdio>

std::wstring getMonitorName(HMONITOR monitor) {
    DISPLAYCONFIG_TOPOLOGY_ID currentTopologyId;
    MONITORINFOEXW info;
    info.cbSize = sizeof(info);
    GetMonitorInfoW(monitor, &info);

    UINT32 requiredPaths, requiredModes;
    GetDisplayConfigBufferSizes(QDC_ONLY_ACTIVE_PATHS, &requiredPaths, &requiredModes);
    std::vector<DISPLAYCONFIG_PATH_INFO> paths(requiredPaths);
    std::vector<DISPLAYCONFIG_MODE_INFO> modes(requiredModes);
    QueryDisplayConfig(QDC_DATABASE_CURRENT, &requiredPaths, paths.data(), &requiredModes, modes.data(), &currentTopologyId);
   
    for (auto& p : paths) {
        DISPLAYCONFIG_SOURCE_DEVICE_NAME sourceName;
        sourceName.header.type = DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME;
        sourceName.header.size = sizeof(sourceName);
        sourceName.header.adapterId = p.sourceInfo.adapterId;
        sourceName.header.id = p.sourceInfo.id;
      
        DisplayConfigGetDeviceInfo(&sourceName.header);
        if (wcscmp(info.szDevice, sourceName.viewGdiDeviceName) == 0) {
            DISPLAYCONFIG_TARGET_DEVICE_NAME name;
            name.header.type = DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME;
            name.header.size = sizeof(name);
            name.header.adapterId = p.sourceInfo.adapterId;
            name.header.id = p.targetInfo.id;
            DisplayConfigGetDeviceInfo(&name.header);
            return std::wstring(name.monitorFriendlyDeviceName);
        }
    }
    return L"";
}


BOOL CALLBACK MyInfoEnumProc(
    HMONITOR hMonitor,
    HDC hdcMonitor,
    LPRECT lprcMonitor,
    LPARAM dwData
)
{
    MONITORINFOEX mi;
    ZeroMemory(&mi, sizeof(mi));
    mi.cbSize = sizeof(mi);
    GetMonitorInfo(hMonitor, &mi);
    wprintf(L"DisplayDevice: %s\n", mi.szDevice);

    std::wcout << L"Name: " << getMonitorName(hMonitor) << L"\n";
    return TRUE;
}

int main()
{
    EnumDisplayMonitors(NULL, NULL, MyInfoEnumProc, 0);
    return 0;
}

调试: