小编PuF*_*F1k的帖子

如何将 PHYSICAL_MONITOR 与监视器 DeviceID 关联

我需要帮助将从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 ,反之亦然。

我需要将它们关联起来,因为:

  1. HANDLE PHYSICAL_MONITOR.hPhysicalMonitor 将用于lowlevelmonitorconfigurationapi,因为我需要向监视器发送命令。

  2. 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)

c++ winapi multiple-monitors low-level low-level-api

6
推荐指数
1
解决办法
1559
查看次数

如何在多个显示器上正确使用 SetDisplayConfig?

我正在创建一个小程序,它将包含桌面中的所有显示器(扩展模式)或禁用所有辅助显示器(显示器可以连接到 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 断开第二个显示器后,此功能才有效)显示器连接到主板)。

我尝试使用 …

c++ winapi multiple-monitors

2
推荐指数
1
解决办法
3514
查看次数