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

时间:2012-07-05 15:57:25

标签: windows winapi windows-7 windows-shell multiple-monitors

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

  1. EnumDisplayDevices和GetMonitorInfo在Windows 7中为此not reliable anymore
  2. 我尝试了GetMonitorInfo,然后从MONITORINFOEX.szDevice(I.E. \。\ Display2)中提取监视器编号但没有成功。两年前另一个人did that too声称getMonitorInfo有一个bug。微软将This bug标记为已修复,没有任何评论,但仍可在具有最新更新的win7机器上重现。 (顺便说一下,任何人都可以告诉我 - 也许win8上没有这个bug?)
  3. 我尝试使用新的CCD API QueryDisplayConfig,但未找到所需的信息。
  4. 有人知道吗?

3 个答案:

答案 0 :(得分:1)

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

我主要使用参数值GetSystemMetricsSM_CXVIRTUALSCREENSM_CYVIRTUALSCREENSM_XVIRTUALSCREEN调用我的Windows应用程序函数SM_YVIRTUALSCREEN,以避免完全打开应用程序窗口或部分位于展示区域之外。如果用户已将显示区域扩展到多个监视器上,但是并非所有监视器都已打开,则应用程序窗口仍然不可见。

SPI_GETWORKAREA参数值为uiAction的{​​{3}}函数对于了解应用程序窗口的位置以及主屏幕宽度和高度的大小也非常有用没有被其他窗户(酒吧)一直隐藏在顶部。

另请参阅SystemParametersInfo function,如果Windows应用程序中需要更多来自监视器的信息。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

对于Windows 7支持WDDM的Windows版本,您可以简单地使用DXGI,它是DirectX的一部分。 DXGI允许您非常容易地枚举现有的显示适配器,每个适配器的可用显示输出以及每个显示输出支持的显示模式。在枚举时,您可以读出许多其他数据,如句柄,标识符和设备名称。所有这些都可以很容易地用于检索工作区域。枚举适配器和输出的顺序由系统定义,并与配置屏幕的顺序相匹配。

有关详细信息,请参阅此处:MSDN DXGI Overview