如何通过编程从Win7屏幕分辨率对话框中获取显示器数量?

11
当你在屏幕分辨率对话框中按下“识别”按钮时,Windows会在每个显示器上显示大的白色监视器编号。在Windows XP中(使用EnumDisplayDevices),以编程方式找到它们以及监视器坐标很容易,但在Windows 7中它被破坏了。我该怎么做?
  1. 在Windows 7中,EnumDisplayDevices和GetMonitorInfo已经不再可靠
  2. 我尝试过使用GetMonitorInfo,并从MONITORINFOEX.szDevice(即\.\Display2)中提取监视器编号,但没有成功。另一个人也曾经这样做,两年前声称getMonitorInfo存在一个bug。这个bug被微软标记为已修复,但没有任何评论,但仍然可以在安装了最新更新的win7机器上重现。(顺便问一下,有人能告诉我 - 或许这个bug在win8上不存在吗?)
  3. 我尝试使用新的CCD API中的QueryDisplayConfig,但没有找到所需信息。

有人知道路吗?


可能是 如何检索监视器信息? 的重复问题。 - Deanna
3个回答

5

Windows没有提供允许应用程序获取显示设置应用程序所使用数字的函数。这些数字只对显示设置应用程序特定,没有在系统中或用于查询/设置显示拓扑的CCD APIs中任何含义。

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


所以,“你不能”仍然是正确的答案。我很难过:( - Roddy

2

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

在我的Windows应用程序中,我主要使用参数值SM_CXVIRTUALSCREENSM_CYVIRTUALSCREENSM_XVIRTUALSCREENSM_YVIRTUALSCREEN来调用函数GetSystemMetrics,以避免将应用程序窗口完全或部分地打开到显示区域之外。然而,如果用户将显示区域扩展到多个显示器上,但不是所有显示器都被打开,应用程序窗口可能仍然看不见。

对于uiAction参数,使用值为SPI_GETWORKAREASystemParametersInfo function也非常有用,可以了解应用程序窗口可以放置在哪里,以及在主屏幕上可以有多大的宽度和高度,而不会被其他始终置顶的窗口(栏)部分隐藏。

如需在您的Windows应用程序中获取更多有关显示器的信息,请参阅GetMonitorInfo函数

0

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

更多信息请参见此处:MSDN DXGI概述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接