【发布时间】:2019-11-29 21:01:02
【问题描述】:
我正在创建一个小程序,它将包括桌面中的所有显示器(扩展模式)或禁用所有辅助显示器(显示器可以连接到 gpus 和集成显卡)。
此程序适用于 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() 函数来定位特定显示器(或一次所有显示器),或者有另一种方法来解决这个问题?
【问题讨论】:
-
对于代码中的
ERROR_ADAP_HDW_ERR,它与有效的SDC_TOPOLOGY_EXTEND标志组合有关,pathArray 和modeInfoArray 参数必须为NULL,并且它们的关联大小必须为零。参考this,有很多不活动的路径,所以你不能将pathArray[i].flags改为1。同一个监视器可以由不同的“源”服务,具体取决于拓扑。注意,“来源”是视图索引(不是监控索引)!要识别监视器,需要比较“目标”。
标签: c++ winapi multiple-monitors