Задать вопрос
@mardokvk
Я junior-программист, мой профиль С#, изучаю С++.

Как сделать скриншот второго монитора на С++?

Я успешно делаю скриншот основного экрана через функция HDC scrdc = GetDC(0); но у меня совсем не получается сделать скриншот любого другого экрана. Я так же не могу получить один большой скрин всех экранов. Подскажите пожалуйста способы.
Вот как я делаю скриншот основного экрана:
HBITMAP CreateBMPScreen() {
	HDC scrdc = GetDC(0);

	int Height = GetSystemMetrics(SM_CYSCREEN), Width = GetSystemMetrics(SM_CXSCREEN);

	HDC memdc = CreateCompatibleDC(scrdc);
	HBITMAP membit = CreateCompatibleBitmap(scrdc, Width, Height);
	SelectObject(memdc, membit);
	BitBlt(memdc, 0, 0, Width, Height, scrdc, 0, 0, SRCCOPY);
	HBITMAP hBitmap = (HBITMAP)SelectObject(memdc, membit);

	return hBitmap;
}
  • Вопрос задан
  • 112 просмотров
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Разработчик на C++
    12 месяцев
    Далее
  • Академия Эдюсон
    Разработчик игр на Unreal Engine + ИИ
    9 месяцев
    Далее
  • Stepik
    Профессия: Разработчик C++ (Junior)
    2 месяца
    Далее
Решения вопроса 2
opium
@opium
Просто люблю качественно работать
SM_CXSCREEN и SM_CYSCREEN дают размер только основного монитора, отсюда и обрезка. Нужны SM_XVIRTUALSCREEN/SM_YVIRTUALSCREEN (отступ виртуального стола от начала координат, может быть отрицательным) и SM_CXVIRTUALSCREEN/SM_CYVIRTUALSCREEN, это размер сразу всех мониторов вместе, а GetDC(0) и так покрывает весь виртуальный десктоп. Для конкретно второго экрана проще пройтись EnumDisplayMonitors, вытащить RECT нужного монитора и BitBlt-ить с его left/top как источником.
Ответ написан
Комментировать
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Можно посмотреть, как это делается тут: https://source.chromium.org/chromium/chromium/src/...

Кажется, GetDC(nullptr) уже выдает виртуальный дисплей со всеми мониторами. Потом через EnumDisplayDevices можно получить координаты нужного вам дисплея и обрезать по ним: https://source.chromium.org/chromium/chromium/src/...

Координаты всего виртуального дисплея берутся через SM_CXVIRTUALSCREEN*: https://source.chromium.org/chromium/chromium/src/...
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
BrainMasterBob
@BrainMasterBob
Предприниматель
Используй EnumDisplayMonitors для перебора. Для нужного HMONITOR передавай в CreateDC его имя через DISPLAY_DEVICE
Ответ написан
Комментировать
@mardokvk Автор вопроса
Я junior-программист, мой профиль С#, изучаю С++.
По итогу GetDC действительно имеет внутри себя все экраны и я смог получить то что мне нужно, долго путался с тем где какие координаты нужны были, но разобрался, всем большое спасибо за участие!
HBITMAP CreateBMPScreen(Gdiplus::Point ptWin, Gdiplus::Point sizeWin) {
	HDC scrdc = GetDC(0);

	int Height = 1080, Width = 1920 + 1920 + 1920;
	HDC memdc = CreateCompatibleDC(scrdc);
	HBITMAP membit = CreateCompatibleBitmap(scrdc, 1360 - 16, 768 - 39);
	SelectObject(memdc, membit);
	BitBlt(memdc, -3840, 0, 5760, 1080, scrdc, 0, 0, SRCCOPY);
	HBITMAP hBitmap = (HBITMAP)SelectObject(memdc, membit);

	return hBitmap;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы