enumDisplayMonitors 函数 (winuser.h)

EnumDisplayMonitors 函数枚举显示监视器 (包括与镜像驱动程序关联的不可见伪监视器) ,这些监视器与指定剪裁矩形的交集与设备上下文的可见区域相交而形成的区域相交。 EnumDisplayMonitors 为枚举的每个监视器调用一次应用程序定义的 MonitorEnumProc 回调函数。 请注意, GetSystemMetrics (SM_CMONITORS) 仅对显示监视器进行计数。

语法

BOOL EnumDisplayMonitors(
  [in] HDC             hdc,
  [in] LPCRECT         lprcClip,
  [in] MONITORENUMPROC lpfnEnum,
  [in] LPARAM          dwData
);

参数

[in] hdc

显示设备上下文的句柄,用于定义感兴趣的可见区域。

如果此参数为 NULL,则传递给回调函数的 hdcMonitor 参数将为 NULL,并且关注的可见区域是包含桌面上所有显示器的虚拟屏幕。

[in] lprcClip

指向指定剪裁矩形的 RECT 结构的指针。 感兴趣区域是剪裁矩形与 hdc 指定的可见区域的交集。

如果 hdc 为非 NULL,则剪裁矩形的坐标相对于 hdc 的原点。 如果 hdcNULL,则坐标为虚拟屏幕坐标。

如果不想剪辑 hdc 指定的区域,此参数可以为 NULL

[in] lpfnEnum

指向 MonitorEnumProc 应用程序定义的回调函数的指针。

[in] dwData

EnumDisplayMonitors 直接传递给 MonitorEnumProc 函数的应用程序定义数据。

返回值

如果该函数成功,则返回值为非零值。

如果函数失败,则返回值为零。

注解

调用 EnumDisplayMonitors 函数有两个原因:

  • 你希望以最佳方式绘制到跨多个显示监视器且监视器具有不同颜色格式的设备上下文中。
  • 你想要获取一个或多个显示监视器的句柄和位置矩形。
若要确定系统中的所有显示监视器是否共享相同的颜色格式,请调用 GetSystemMetrics (SM_SAMEDISPLAYFORMAT) 。

当窗口跨越具有不同颜色格式的显示器时,无需使用 EnumDisplayMonitors 函数。 可以假设整个屏幕具有主监视器的颜色属性,继续绘制。 你的窗口看起来会很好。 EnumDisplayMonitors 只允许你使它们看起来更好。

通过将 hdc 参数设置为 NULL ,可以使用 EnumDisplayMonitors 函数获取一个或多个显示监视器的句柄和位置矩形。 下表显示了 NULL 和非 NULLhdclprcClip 值的四个组合如何影响 EnumDisplayMonitors 函数的行为。

hdc lprcRect EnumDisplayMonitors 行为
NULL NULL 枚举所有显示监视器。回调函数接收 NULL HDC。
NULL non-NULL 枚举与剪裁矩形相交的所有显示监视器。 对剪裁矩形使用虚拟屏幕坐标。回调函数接收 NULL HDC。
non-NULL NULL 枚举与设备上下文的可见区域相交的所有显示监视器。回调函数接收特定显示监视器 DC 的句柄。
non-NULL non-NULL 枚举与设备上下文的可见区域和剪裁矩形相交的所有显示监视器。 对剪裁矩形使用设备上下文坐标。回调函数接收特定显示监视器 DC 的句柄。
 

示例

若要使用每个监视器的功能绘制响应WM_PAINT消息,可以在窗口过程中使用如下所示的代码:


case WM_PAINT:
  hdc = BeginPaint(hwnd, &ps);
  EnumDisplayMonitors(hdc, NULL, MyPaintEnumProc, 0);
  EndPaint(hwnd, &ps);

若要使用每个监视器的功能绘制窗口的上半部分,可以使用如下所示的代码:


GetClientRect(hwnd, &rc);
rc.bottom = (rc.bottom - rc.top) / 2;
hdc = GetDC(hwnd);
EnumDisplayMonitors(hdc, &rc, MyPaintEnumProc, 0);
ReleaseDC(hwnd, hdc);

若要为每个显示监视器以最佳方式绘制整个虚拟屏幕,可以使用如下所示的代码:


hdc = GetDC(NULL);
EnumDisplayMonitors(hdc, NULL, MyPaintScreenEnumProc, 0);
ReleaseDC(NULL, hdc);

若要检索有关所有显示监视器的信息,请使用如下代码:


EnumDisplayMonitors(NULL, NULL, MyInfoEnumProc, 0);  

要求

要求
最低受支持的客户端 Windows 2000 Professional [仅限桌面应用]
最低受支持的服务器 Windows 2000 Server [仅限桌面应用]
目标平台 Windows
标头 winuser.h (包括 Windows.h)
Library User32.lib
DLL User32.dll
API 集 ext-ms-win-ntuser-sysparams-ext-l1-1-1 (在 Windows 10 版本 10.0.14393 中引入)

另请参阅

GetSystemMetrics

MonitorEnumProc

多个显示监视器函数

多显示器监视器概述