【问题标题】:Issue enumerating monitors in Windows在 Windows 中枚举监视器问题
【发布时间】:2014-02-23 21:32:35
【问题描述】:

我的任务是计算连接到运行以下用户模式代码的计算机的当前监视器(屏幕)的数量:

int nCnt = 0;
if(!EnumDisplayMonitors(NULL, NULL, countMonitorsProc, (LPARAM)&nCnt))
{
    //Error
}

BOOL countMonitorsProc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData)
{
    int* pCnt = (int*)dwData;
    (*pCnt)++;

    return TRUE;
}

它在大多数情况下都有效,但在某些系统上,EnumDisplayMonitors 返回 FALSE。此类系统的示例:我的笔记本电脑,我连接了外接显示器并盖上了盖子。

我很好奇,我是否使用正确的方法来计算连接的显示器?

【问题讨论】:

  • GetLastError() 返回什么?
  • 请不要在标题中植入不必要的标签——这就是标签部分的用途。谢谢:)
  • @alk:根据 MSDN,GetLastError 不用于该 API。
  • 是否调用过回调?
  • 如果您只想获取已安装显示器的数量,那您就错了。 nCnt = GetSystemMetrics(SM_CMONITORS); 是正确的方法。

标签: c windows winapi


【解决方案1】:

如果您只想知道连接了多少台显示器,则无需致电EnumDisplayMonitors。对物理(非虚拟)监视器执行此操作的正确方法是通过GetSystemMetrics,索引为SM_CMONITORS。

SM_CMONITORS 桌面上显示监视器的数量。更多 80 信息,请参阅本主题中的备注部分。

来自备注部分

GetSystemMetrics(SM_CMONITORS) 只计算可见的显示监视器。这与 EnumDisplayMonitors 不同,后者枚举与镜像驱动程序关联的可见显示监视器和不可见伪监视器。不可见的伪监视器与用于镜像应用程序绘图以进行远程处理或其他目的的伪设备相关联。

然后调用就变成了

nCnt = GetSystemMetrics(SM_CMONITORS);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-22
    • 2013-08-04
    • 2011-02-25
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多