我正在创建一个小程序,它将包含桌面中的所有显示器(扩展模式)或禁用所有辅助显示器(显示器可以连接到 GPU 和集成显卡)。
该程序适用于Windows 7,因此根据互联网上的信息,我决定使用CCD API,但遇到了SetDisplayConfig()函数的问题。
例如,关闭所有辅助显示器的代码可以完美运行,因为“i”递增其中一个显示器将关闭:
UINT32 PathCount = 0; //path count
UINT32 ModeCount = 0; //mode count
HRESULT hr;
hr = GetDisplayConfigBufferSizes(QDC_ALL_PATHS, &PathCount, &ModeCount);
std::vector<DISPLAYCONFIG_PATH_INFO> pathArray(PathCount);
std::vector<DISPLAYCONFIG_MODE_INFO> modeArray(ModeCount);
hr = QueryDisplayConfig(QDC_ALL_PATHS, &PathCount, &pathArray[0], &ModeCount, &modeArray[0], NULL);
for (int i = 1; i < PathCount;i++)
{
if(pathArray[i].flags != 0)
{
pathArray[i].flags = 0;
hr = SetDisplayConfig(PathCount, &pathArray[0], ModeCount, &modeArray[0], SDC_APPLY | SDC_USE_SUPPLIED_DISPLAY_CONFIG | SDC_ALLOW_CHANGES);
}
}
为了扩展显示,我找到了这段代码:
SetDisplayConfig(0, NULL, 0, NULL, SDC_TOPOLOGY_EXTEND | SDC_APPLY);
具有此特定参数的此功能有效,但它仅针对连接到 GPU 作为主显示器的第二个显示器,而不是连接到主板的第三个显示器(仅在我以物理方式断开第二个显示器与 GPU 的连接后,此功能才有效)显示器连接到主板)。
我尝试使用
for (int i = 1; i < PathCount;i++)
{
if(pathArray[i].flags != 1)
{
pathArray[i].flags = 1;
hr = SetDisplayConfig(PathCount, &pathArray[0], ModeCount, &modeArray[0], SDC_TOPOLOGY_EXTEND | SDC_APPLY | SDC_PATH_PERSIST_IF_REQUIRED);
}
}
但收到 ERROR_ADAP_HDW_ERR 错误
所以我请求帮助我。如何使用带有“SDC_TOPOLOGY_EXTEND”标志的 SetDisplayConfig() 函数来定位特定显示器(或一次所有显示器),或者还有另一种方法来解决此问题?