Функция 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. Если hdc имеет значение NULL, координаты являются координатами виртуального экрана.

Этот параметр может иметь значение NULL , если вы не хотите обрезать регион, заданный hdc.

[in] lpfnEnum

Указатель на функцию обратного вызова, определяемую приложением MonitorEnumProc .

[in] dwData

Определяемые приложением данные, которые EnumDisplayMonitors передают непосредственно в функцию MonitorEnumProc .

Возвращаемое значение

Если функция выполняется успешно, возвращается ненулевое значение.

Если функция выполняется неудачно, возвращается нулевое значение.

Комментарии

Существует две причины для вызова функции EnumDisplayMonitors :

  • Вы хотите оптимально использовать контекст устройства, охватывающий несколько мониторов дисплея, и мониторы имеют разные форматы цветов.
  • Вы хотите получить прямоугольник дескриптора и положения для одного или нескольких мониторов дисплея.
Чтобы определить, имеют ли все мониторы в системе одинаковый цветовый формат, вызовите Метод GetSystemMetrics (SM_SAMEDISPLAYFORMAT).

Вам не нужно использовать функцию EnumDisplayMonitors , когда окно охватывает мониторы с различными форматами цвета. Вы можете продолжать рисовать, предполагая, что весь экран имеет цветовые свойства основного монитора. Окна будут выглядеть нормально. EnumDisplayMonitors просто позволяет сделать их лучше.

Задание для параметра hdcзначения NULL позволяет использовать функцию EnumDisplayMonitors для получения прямоугольника дескриптора и положения для одного или нескольких мониторов дисплея. В следующей таблице показано, как четыре сочетания значений HDC и hdclip, отличных от NULL, влияют на поведение функции EnumDisplayMonitors.

Hdc lprcRect Поведение EnumDisplayMonitors
NULL NULL Перечисляет все мониторы отображения. Функция обратного вызова получает HDC NULL .
NULL отличное от NULL Перечисляет все мониторы отображения, которые пересекаются с прямоугольником обрезки. Используйте виртуальные экранные координаты для прямоугольника обрезки. Функция обратного вызова получает HDC NULL .
отличное от NULL NULL Перечисляет все мониторы отображения, которые пересекаются с видимой областью контекста устройства. Функция обратного вызова получает дескриптор контроллера домена для конкретного монитора дисплея.
отличное от NULL отличное от NULL Перечисляет все мониторы отображения, которые пересекаются с видимой областью контекста устройства и прямоугольником обрезки. Используйте координаты контекста устройства для прямоугольника обрезки. Функция обратного вызова получает дескриптор контроллера домена для конкретного монитора дисплея.
 

Примеры

Чтобы зарисовать в ответ на сообщение 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
Header winuser.h (включая Windows.h)
Библиотека User32.lib
DLL User32.dll
Набор API ext-ms-win-ntuser-sysparams-ext-l1-1-1 (представлено в Windows 10, версия 10.0.14393)

См. также раздел

GetSystemMetrics

MonitorEnumProc

Функции мониторов с несколькими дисплеями

Обзор мониторов с несколькими дисплеями