我需要帮助将从GetPhysicalMonitorsFromHMONITOR获得的 PHYSICAL_MONITOR与监视器 DISPLAY_DEVICE.DeviceID 关联起来(例如“\?\DISPLAY#GSM59AB#5&932a802&1&UID261#{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}”),它来自使用的EnumDisplayDevices带有标志 EDD_GET_DEVICE_INTERFACE_NAME ,或者以某种方式从 DISPLAY_DEVICE.DeviceID 获取 PHYSICAL_MONITOR ,反之亦然。
我需要将它们关联起来,因为:
HANDLE PHYSICAL_MONITOR.hPhysicalMonitor 将用于lowlevelmonitorconfigurationapi,因为我需要向监视器发送命令。
DISPLAY_DEVICE.DeviceID 用于使用 SetupAPI 从注册表获取 EDID 结构(前 128 个字节对我来说足够了,只需要制造商代码和型号)
1和2已经完成,问题在于将id与物理监视器关联起来。 此外,还可以仅使用 SetupAPI 从注册表获取所有显示器 EDID,但在这种情况下,不可能获取物理显示器句柄。
MSDN上同样的问题,没有解决((
我还注意到一件事:此代码枚举了所有监视器:
DWORD DispNum = 0;
DISPLAY_DEVICE DisplayDevice;
// Initialize DisplayDevice.
ZeroMemory(&DisplayDevice, sizeof(DisplayDevice));
DisplayDevice.cb = sizeof(DisplayDevice);
while ((EnumDisplayDevices(NULL, DispNum, &DisplayDevice, 0)))
{
std::wstring deviceName = DisplayDevice.DeviceName;
DISPLAY_DEVICE DisplayDeviceM;
ZeroMemory(&DisplayDeviceM, sizeof(DisplayDeviceM));
DisplayDeviceM.cb = sizeof(DisplayDeviceM);
int monitorIndex = 0;
while (EnumDisplayDevices(deviceName.c_str(), monitorIndex, &DisplayDeviceM, EDD_GET_DEVICE_INTERFACE_NAME))
{
std::wstring monitorID = …Run Code Online (Sandbox Code Playgroud) 我正在创建一个小程序,它将包含桌面中的所有显示器(扩展模式)或禁用所有辅助显示器(显示器可以连接到 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);
}
}
Run Code Online (Sandbox Code Playgroud)
为了扩展显示,我找到了这段代码:
SetDisplayConfig(0, NULL, 0, NULL, SDC_TOPOLOGY_EXTEND | SDC_APPLY);
Run Code Online (Sandbox Code Playgroud)
具有此特定参数的此功能有效,但它仅针对连接到 GPU 作为主显示器的第二个显示器,而不是连接到主板的第三个显示器(仅在我以物理方式从 GPU 断开第二个显示器后,此功能才有效)显示器连接到主板)。
我尝试使用 …