【问题标题】:How can I retrieve monitor information?如何检索监视器信息?
【发布时间】:2011-02-05 17:08:28
【问题描述】:

我正在尝试检索 Windows 显示属性(#1、2...等)中显示的监视器 ID,但我似乎找不到方法。我尝试过使用 EnumDisplayMonitors 以及 EnumDisplayDevices。他们都返回类似“\.\DISPLAY1”的东西。但是,此数字并不总是与 Windows 显示的数字相匹配,尤其是在使用 2 个视频卡驱动 3 个或更多显示器时。我是否缺少 API 调用来检索此信息,或者有没有办法从注册表或其他地方获取它?谢谢!

我已经尝试过这些方法:
Win32: EnumDisplayMonitors、EnumDisplayDevices:这些都不会返回不活动的监视器,也不会返回正确的 ID。
WMI: "select * from Win32_DesktopMonitor" 没有返回所有的显示器,也没有 ID。
注册表: 我在不同的位置找到了显示器,没有一个我找到的地方有我正在寻找的信息。

非常感谢任何帮助。 :)

更新:这些是我正在寻找的监视器编号:

【问题讨论】:

  • 老问题,找到答案了吗?
  • 有人找到解决方案吗?
  • @JoelBarsotti,你解决了这个问题吗?

标签: .net c++ windows winapi monitors


【解决方案1】:

根据目的,您可能希望寻求基于驱动程序的解决方案。我知道 nVidia 有一些不错的库,可让您访问控制面板中的大部分功能。

【讨论】:

  • 这是一个有趣的想法,但我需要更通用的东西,不能依赖特定的驱动程序。
【解决方案2】:

您是否对 EnumDisplayDevices 进行了两次调用?尝试类似:

while (EnumDisplayDevices(0, dev, &dd, 0))
{
...
  while (EnumDisplayDevices(dd.DeviceName, devMon, &ddMon, 0))
  {
   ...
  }
}

【讨论】:

  • 我已经这样做了,但是监视器号在哪里返回?
  • 监控号是什么意思?如果提到“devMon”,则以devMon = 0开头,并在内部“while”中制作devMon++。
  • 我已经用我正在寻找的监视器编号的图片更新了问题。
【解决方案3】:

只是猜测,但 Windows 似乎在 Windows 显示属性中显示 iDevNum+1

【讨论】:

  • 不幸的是,事实并非如此,那太容易了。 :) 如果您有双显示器系统,请尝试将#2 设为主要并禁用#1。 #2 在“显示属性”窗口中仍将被称为 2 号,但它将是 EnumDisplayDevices (iDevNum 0) 返回的第一个监视器。 :(
  • 此外,EnumDisplayMonitors 返回监视器的顺序似乎是随机的。大多数情况下它会以相同的顺序返回它们,但如果你有 2 个显卡驱动 3 个显示器,它可以改变。
  • 这引导我走上正确的道路,但不适用于 Windows 7。
  • 您写了“引导我走上正确的道路”,但没有写出正确的道路是什么。我现在正在研究同样的问题,所以我很想知道你最终是如何解决这个问题的:^)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-01
  • 1970-01-01
  • 2014-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多