Как можно сделать скриншот на C++?

Рейтинг: 0Ответов: 2Опубликовано: 05.02.2023

Мне нужно закинуть его в буфер (если такой есть) или массив, проанализировать его и в зависимости от того, что там есть, нажать мышкой по координатам. Нужно делать скриншот с определённой периодичностью, какая нужна команда и библиотека? Если записываются данные в двумерный массив (A[X][Y] = цвет;) тогда всё ок. Если записываются в какой-то буфер нужна команда чтобы узнать цвет пикселя по определённым координатам.

C++ Пользуюсь недавно, комментарии к командам приветствуются (использую Visual Studio).

Ответы

▲ 0
#include <Windows.h>
#include <iostream>

using namespace std;

int main() {
    int width = GetSystemMetrics(SM_CXSCREEN);
    int height = GetSystemMetrics(SM_CYSCREEN);

    HDC hdcScreen = GetDC(NULL);
    HDC hdcCompatible = CreateCompatibleDC(hdcScreen);

    HBITMAP hBitmap = CreateCompatibleBitmap(hdcScreen, width, height);
    HGDIOBJ hOld = SelectObject(hdcCompatible, hBitmap);

    BitBlt(hdcCompatible, 0, 0, width, height, hdcScreen, 0, 0, SRCCOPY);

    BITMAPINFO bmi;
    ZeroMemory(&bmi, sizeof(BITMAPINFO));
    bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bmi.bmiHeader.biWidth = width;
    bmi.bmiHeader.biHeight = height;
    bmi.bmiHeader.biPlanes = 1;
    bmi.bmiHeader.biBitCount = 32;
    bmi.bmiHeader.biCompression = BI_RGB;

    int** pixels = new int*[height];
    for (int i = 0; i < height; i++) {
        pixels[i] = new int[width];
    }

    GetDIBits(hdcScreen, hBitmap, 0, height, (LPVOID*)pixels, &bmi, DIB_RGB_COLORS);

    SelectObject(hdcCompatible, hOld);
    DeleteObject(hBitmap);
    DeleteDC(hdcCompatible);
    ReleaseDC(NULL, hdcScreen);

    // Теперь мы можем использовать массив pixels для анализа скриншота.

    return 0;
} 

Чтобы получить цвет пикселя по координатам (x, y), вы можете использовать следующую функцию:

int getPixelColor(int x, int y, int** pixels) {
    return pixels[y][x];
}
▲ 0

HDC, или Handle to Device Context, представляет собой нечто вроде абстрактного интерфейса, который функционирует как многослойный дескриптор для управления графическими операциями в рамках Windows API. Он по сути является сложной метапарадигмой, инкапсулирующей состояние рендеринга, которое варьируется в зависимости от контекста устройства и параметров приложения.

Когда вы создаете HDC, система инициализирует его с набором параметров, таких как DPI, цветовая палитра и текущая точка отсчета, что делает его не просто указателем, а динамически изменяемым объектом, который может взаимодействовать с множеством графических ресурсов. Например, HDC может ассоциироваться с различными графическими объектами, кистями.

Неправильное использование HDC может вызвать нежелательные эффекты, такие как некорректное отображение графики. У меня возникали проблемы при создании нескольких самописных кнопок одного класса.

HDC может быть ассоциирован с различными режимами рендеринга, такими как GDI или Direct2D.

Чтобы HDC правильно работал надо учитывать развернуто ли приложение или нет. От этого тоже многое зависит. В win api свои приколы с этим.