为了管理显示适配器和显示属性,我的代码使用了来自两个不同 Windows DLL 的 API:
cfgMgr32.dll
我使用 CfgMgr32(SetupApi 的继承者)中的函数来:
- 枚举适配器(获取 id 和属性)
- 确定是否存在特定的适配器
- 确定适配器是否启用/禁用
- 启用/禁用适配器
- 注册回调以接收 PnP 设备事件
CfgMgr32(和 SetupApi)中的 API 使用以下形式的适配器 ID(称为DeviceInstanceId或PNPDeviceID):"SWD\MyEnumerator\MyInstance"
User32.dll
我使用 User32 中的函数来:
- 枚举适配器(获取 id 和属性)
- 查询适配器支持的分辨率
- 查询适配器当前的显示模式
- 更改适配器的当前方向
- 更改适配器的当前分辨率
User32 中的 API 使用完全不同的适配器 id(称为DeviceName)的形式:"\\.\DISPLAY23"
(惊人的)问题:
似乎没有记录在这两种形式的唯一标识符之间的映射方式。我可以启用一个适配器,但是当我想更改它的方向或分辨率时,我无法知道返回的哪些标识符是EnumDisplayDevices(...)
指我刚刚启用的同一个适配器。
我需要的 API 分布在两个库中;这两个库都没有提供一整套显示适配器管理功能。
这两个库都具有让您获取有关特定适配器的信息的功能,并且有一些小的重叠,但至关重要的是:没有什么是单个适配器所独有的。也许有一些方法可以明确地将属性从一侧关联到另一侧,但我已经丢弃了所有可用的信息(包括 SystemInformation、Screen.AllScreens、Wmi 查询,如 Win32_VideoController、DISPLAY_DEVICE ......)以及所有我能做到的信息找不到任何可映射的东西。
有没有人解决过这个问题,或者知道一些可能值得一看的开源项目?