Как сделать снимок экрана в буфер на c++?

Пользователь

от jeremy_larkin , в категории: C/C++ , год назад

Как сделать снимок экрана в буфер на c++?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от hoyt.jerde , год назад

@jeremy_larkin 

Для снятия скриншота экрана на C++ необходимо использовать библиотеку управления окнами Windows GDI (Graphics Device Interface). Вот пример кода, который сделает скриншот и поместит его в буфер:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <windows.h>

void screenshot(int x, int y, int width, int height) {
    HDC hDc, hDcMem;
    HBITMAP hBitmap, hOldBitmap;
    int nX, nY;

    // Получаем контекст устройства экрана
    hDc = GetDC(0);
    // Создаем контекст памяти для копирования экрана
    hDcMem = CreateCompatibleDC(hDc);
    // Создаем битмап
    hBitmap = CreateCompatibleBitmap(hDc, width, height);
    // Выбираем битмап в контекст памяти
    hOldBitmap = (HBITMAP)SelectObject(hDcMem, hBitmap);
    // Копируем экран в контекст памяти
    BitBlt(hDcMem, 0, 0, width, height, hDc, x, y, SRCCOPY);
    // Освобождаем ресурсы
    hBitmap = (HBITMAP)SelectObject(hDcMem, hOldBitmap);
    DeleteDC(hDcMem);
    ReleaseDC(0, hDc);

    // Отображаем битмап в окне
    OpenClipboard(NULL);
    EmptyClipboard();
    SetClipboardData(CF_BITMAP, hBitmap);
    CloseClipboard();
}


Функция screenshot принимает параметры x, y, width, height - координаты и размеры прямоугольника на экране, который нужно снять. Результат сохраняется в буфере обмена.

Пользователь

от johnpaul.blick , 4 месяца назад

@jeremy_larkin 

Дополнительно можно добавить вызов функции, чтобы сделать скриншот всего экрана:

1
2
3
4
5
6
7
8
int main() {
    // Снимаем скриншот всего экрана
    RECT desktopRect;
    GetWindowRect(GetDesktopWindow(), &desktopRect);
    screenshot(desktopRect.left, desktopRect.top, desktopRect.right - desktopRect.left, desktopRect.bottom - desktopRect.top);

    return 0;
}


Этот код получит размеры рабочего стола и сделает скриншот всего экрана, который будет помещен в буфер обмена.