Получение контекста HDC всех подключенных экранов по отдельности WinApi
Подскажите пожалуйста, я окончательно запутался: мне необходимо получить контекст - тот которой тип HDC каждого экрана по отдельности.
На MSDNе написано:
Любая функция, которая возвращает контекст устройства отображения (DC), обычно возвращает DC для основного монитора. Чтобы получить DC для другого монитора, используйте функцию EnumDisplayMonitors
Но функция EnumDisplayMonitors - не возвращает и не перечисляет контексты дисплеев(ну или я не понял как их достать), более того, первым параметром функции я должен указать HDC контекст дисплея.
Ответы (1 шт):
Насколько я понял, параметр 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;
}