c++ - 如何检测显示器是否是投影仪?

标签 c++ winapi multiple-monitors

有没有办法使用 Windows API 来检测特定监视器是否是投影仪(投影仪)而不是屏幕?

(我正在编写一个投影映射桌面应用程序,我希望它能够自动检测投影仪是否已连接并处于事件状态,以允许用户将现实与预览进行比较。)

我同时使用了 EnumDisplayMonitors 和 EnumDisplayDevices 来查找监视器,但我找不到任何标志或其他显示类型的指示。我查看了 DEVMODE 和 DISPLAY_DEVICE 以及后者指向的注册表项。我没有看到可以区分屏幕和投影仪的 DeviceCapabilities 或 GetDeviceCaps 调用。我还查看了设备管理器,看看是否有一个属性可以将我的常规显示器与投影仪区分开来,但我找不到任何东西。所以也许没有办法做到这一点。

但是,屏幕分辨率控制面板小程序将投影仪识别为“PROJECTOR”,同时将我的主显示器识别为“Dell U3011”。使用 EnumDisplayDevices,我可以从 DISPLAY_DEVICE 获取“Dell U3011”字符串,但是对于投影仪,我只能获取“Generic PnP Monitor”。不知何故,该小程序必须在其他地方查找以获取该“PROJECTOR”字符串,或者它为任何看似投影仪的通用 PnP 监视器显示“PROJECTOR”。那么它看起来在哪里以及它是如何知道的?

最佳答案

我认为答案是没有可靠的方法。

控制面板显示的“PROJECTOR”字符串是系统从 EDID information 中提取的任意文本。 .据我所知,Windows 实际上并不“知道”显示器是投影仪、LCD 面板还是 CRT 管。

EDID 信息似乎没有标志来表明这是否是投影仪。我看到一条注释,投影仪通常会将一个或两个物理图像尺寸(以厘米为单位)设置为零。但那是在 EDID 1.4 的描述中,我的大多数设备都使用 EDID 1.3。实际上,我尝试过的投影仪没有任何物理尺寸为 0,因此这不是一个可靠的信号。

关于c++ - 如何检测显示器是否是投影仪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49602874/

相关文章:

c++ - 如何在我的项目中嵌入 bat 文件?

c++ - 模拟鼠标点击而不移动光标

c# - 设置 OpenFileDialog/SaveFileDialog 的开始位置

c++ - Qt如何枚举屏幕?

C++ Direct3D 多屏幕捕获

C++ 三角平面相交线

c# - C++ 和 C# 可以用于 iPhone 应用程序吗

c++ - 使用 Boost Karma 打印 boost::posix_time::time_duration

char 和 int 之间的 C++ 转换结果错误

c++ - GetRawInputData 不适用于 x64 构建