Получение контекста HDC всех подключенных экранов по отдельности WinApi

Подскажите пожалуйста, я окончательно запутался: мне необходимо получить контекст - тот которой тип HDC каждого экрана по отдельности.

На MSDNе написано:

Любая функция, которая возвращает контекст устройства отображения (DC), обычно возвращает DC для основного монитора. Чтобы получить DC для другого монитора, используйте функцию EnumDisplayMonitors

Но функция EnumDisplayMonitors - не возвращает и не перечисляет контексты дисплеев(ну или я не понял как их достать), более того, первым параметром функции я должен указать HDC контекст дисплея.


Ответы (1 шт):

Автор решения: t3f

Насколько я понял, параметр hdc в функции EnumDisplayMonitors ограничивает перечисление. Значит, нужно указать такой HDC, который покрывает сразу все мониторы. И такой HDC есть, как сказано в описании функции CreateDC:

If there are multiple monitors on the system, calling CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL) will create a DC covering all the monitors.

Соответственно, приходим к такому решению:

HDC common_dc = CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL);
EnumDisplayMonitors(common_dc, NULL, (MONITORENUMPROC)MonitorEnumProc, NULL);

И в callback-функции получаем HDC для каждого монитора:

BOOL MonitorEnumProc(HMONITOR monitor, HDC hdc, LPRECT rect, LPARAM data) {
    dc_list.push_back(hdc);
    return TRUE;
}

Можно также отправить в EnumDisplayMonitors NULL. Callback-функция в таком случае тоже будет получать NULL вместо HDC, но HMONITOR будет доступен. Так что можно будет получить имя устройства и использовать это имя, чтобы создать DC:

BOOL MonitorEnumProc(HMONITOR monitor, HDC hdc, LPRECT rect, LPARAM data) {
    MONITORINFOEX info;
    info.cbSize = sizeof(MONITORINFOEX);
    GetMonitorInfo(monitor, &info);
    dc_list.push_back(CreateDC(NULL, info.szDevice, NULL, NULL));
    return TRUE;
}
→ Ссылка