调用 SetDisplayConfig 时如何获取用于 ModeArray 和 PathArray 结构的目标 ID?

How can I get the target ids for use in the ModeArray and PathArray structures when calling SetDisplayConfig?

我希望能够以编程方式更改显示配置,而不是使用 Windows 显示设置。我可以使用 QueryDisplayConfig 获取有关当前设置的所有信息,保存值,更改显示设置,然后使用保存的值使用 SetDisplayConfig 再次恢复配置。所以这给了我一个机制,只要我能正确设置参数就可以工作。

问题出在 ModeArray 和 PathArray 结构中使用的 ID。 QueryDisplayConfig 仅提供有关正在使用的路径和适配器的信息,例如,从克隆的 2 个显示器切换到所有 3 个扩展显示器的三个显示系统会引入不可用的适配器 ID。我可以使用 IDXGIAdapter::GetDesc 检索系统的所有 adapterid LUID 参数,但问题是 ModeArray 结构中的 id 参数,尤其是在设置 DISPLAYCONFIG_MODE_INFO_TYPE_TARGET 时。源模式 ID 似乎只是 0、1 等。目标 ID 不像适配器 ID 那样易变,并且不依赖于连接到显示端口的监视器。我想它们是由显示驱动程序生成的。拖网注册表不会产生任何明显的结果。有什么想法吗?

id可以通过枚举监听接口得到

BOOL GetMonitorDeviceInfo()
{
HDEVINFO                         hDevInfo;
SP_DEVICE_INTERFACE_DATA         DevIntfData;
PSP_DEVICE_INTERFACE_DETAIL_DATA DevIntfDetailData;
SP_DEVINFO_DATA                  DevData;

DWORD dwSize, dwType, dwMemberIdx;
HKEY hKey;
BYTE lpData[1024];
int i = 0;

hDevInfo = SetupDiGetClassDevs(
    &GUID_DEVINTERFACE_MONITOR, NULL, 0, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);

if (hDevInfo != INVALID_HANDLE_VALUE)
{
    DevIntfData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
    dwMemberIdx = 0;

    SetupDiEnumDeviceInterfaces(hDevInfo, NULL, &GUID_DEVINTERFACE_MONITOR,
        dwMemberIdx, &DevIntfData);

    while(GetLastError() != ERROR_NO_MORE_ITEMS)
    {
        DevData.cbSize = sizeof(DevData);

        SetupDiGetDeviceInterfaceDetail(
              hDevInfo, &DevIntfData, NULL, 0, &dwSize, NULL);

        DevIntfDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwSize);
        DevIntfDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);

        if (SetupDiGetDeviceInterfaceDetail(hDevInfo, &DevIntfData,
            DevIntfDetailData, dwSize, &dwSize, &DevData))
        {
            // use data
        }

        HeapFree(GetProcessHeap(), 0, DevIntfDetailData);

        SetupDiEnumDeviceInterfaces(
            hDevInfo, NULL, &GUID_DEVINTERFACE_MONITOR, ++dwMemberIdx, &DevIntfData);
    }

    SetupDiDestroyDeviceInfoList(hDevInfo);
}
return 0;
}

设备 ID 位于 DevIntfData 结构的 DevicePath 成员的 uid 部分。 例如。 DevicePath 0x0211d3dc "\?\display#dela00b#7&1e7b3638&0&uid256#{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}"