如何以编程方式从win7中的"屏幕分辨率"对话框中获取监视器编号?

boq*_*apt 10 windows winapi multiple-monitors windows-shell windows-7

当您在屏幕分辨率对话框中按下识别按钮时,Windows会在每个监视器上显示大的白色监视器编号.很容易在Windows XP(使用EnumDisplayDevices)中以编程方式与监视器坐标一起找到它们,但在Windows 7上它已经坏了.我怎样才能做到这一点?

  1. 在Windows 7中,EnumDisplayDevices和GetMonitorInfo 不再可靠.
  2. 我尝试了GetMonitorInfo,然后从MONITORINFOEX.szDevice(IE \.\ Display2)中提取监视器编号,但没有成功.另外一个人两年前就这样做了并声称getMonitorInfo有一个bug.微软将此错误标记为已修复,没有任何评论,但仍可在具有最新更新的win7机器上重现.(顺便说一下,任何人都可以告诉我 - 也许win8上没有这个bug?)
  3. 我从新的CCD API 尝试了QueryDisplayConfig,但没有找到所需的信息.

有人知道吗?

Dav*_*son 5

Windows 不提供允许应用程序获取显示设置应用程序使用的数字的功能。这些数字本身仅特定于显示设置应用程序,在系统或用于查询/设置显示拓扑的CCD API中没有任何意义。

最好的选择是应用程序在提示用户选择显示器时定义自己的分配索引的标准。


Mof*_*ofi 2

我从来不想知道 Windows 应用程序中显示器的数量,但您可以使用参数值调用GetSystemMetrics 函数SM_CMONITORS来获取桌面上显示显示器的数量。

GetSystemMetrics主要使用参数值SM_CXVIRTUALSCREEN、 、 来调用 Windows 应用程序函数SM_CYVIRTUALSCREENSM_XVIRTUALSCREENSM_YVIRTUALSCREEN避免完全或部分在显示区域之外打开应用程序窗口。如果用户将显示区域扩展到多个监视器,但并非所有监视器都打开,则应用程序窗口可能仍然不可见。

具有参数值的SystemParametersInfo函数对于了解应用程序窗口的位置以及主屏幕上的宽度和高度可以有多大,而不会被始终位于顶部的其他窗口(栏)部分隐藏也非常有用。SPI_GETWORKAREAuiAction

如果您的 Windows 应用程序需要来自监视器的更多信息,另请参阅GetMonitorInfo 函数。