0

为了管理显示适配器和显示属性,我的代码使用了来自两个不同 Windows DLL 的 API:

cfgMgr32.dll

我使用 CfgMgr32(SetupApi 的继承者)中的函数来:

  • 枚举适配器(获取 id 和属性)
  • 确定是否存在特定的适配器
  • 确定适配器是否启用/禁用
  • 启用/禁用适配器
  • 注册回调以接收 PnP 设备事件

CfgMgr32(和 SetupApi)中的 API 使用以下形式的适配器 ID(称为DeviceInstanceIdPNPDeviceID):"SWD\MyEnumerator\MyInstance"

User32.dll

我使用 User32 中的函数来:

  • 枚举适配器(获取 id 和属性)
  • 查询适配器支持的分辨率
  • 查询适配器当前的显示模式
  • 更改适配器的当前方向
  • 更改适配器的当前分辨率

User32 中的 API 使用完全不同的适配器 id(称为DeviceName)的形式:"\\.\DISPLAY23"

(惊人的)问题:

似乎没有记录在这两种形式的唯一标识符之间的映射方式。我可以启用一个适配器,但是当我想更改它的方向或分辨率时,我无法知道返回的哪些标识符是EnumDisplayDevices(...)指我刚刚启用的同一个适配器。

我需要的 API 分布在两个库中;这两个库都没有提供一整套显示适配器管理功能。

这两个库都具有让您获取有关特定适配器的信息的功能,并且有一些小的重叠,但至关重要的是:没有什么是单个适配器所独有的。也许有一些方法可以明确地将属性从一侧关联到另一侧,但我已经丢弃了所有可用的信息(包括 SystemInformation、Screen.AllScreens、Wmi 查询,如 Win32_VideoController、DISPLAY_DEVICE ......)以及所有我能做到的信息找不到任何可映射的东西。

有没有人解决过这个问题,或者知道一些可能值得一看的开源项目?

4

0 回答 0