Как можно сделать скриншот на C++?
Мне нужно закинуть его в буфер (если такой есть) или массив, проанализировать его и в зависимости от того, что там есть, нажать мышкой по координатам. Нужно делать скриншот с определённой периодичностью, какая нужна команда и библиотека? Если записываются данные в двумерный массив (A[X][Y] = цвет;) тогда всё ок. Если записываются в какой-то буфер нужна команда чтобы узнать цвет пикселя по определённым координатам.
C++ Пользуюсь недавно, комментарии к командам приветствуются (использую Visual Studio).
Ответы (2 шт):
#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];
}
HDC, или Handle to Device Context, представляет собой нечто вроде абстрактного интерфейса, который функционирует как многослойный дескриптор для управления графическими операциями в рамках Windows API. Он по сути является сложной метапарадигмой, инкапсулирующей состояние рендеринга, которое варьируется в зависимости от контекста устройства и параметров приложения.
Когда вы создаете HDC, система инициализирует его с набором параметров, таких как DPI, цветовая палитра и текущая точка отсчета, что делает его не просто указателем, а динамически изменяемым объектом, который может взаимодействовать с множеством графических ресурсов. Например, HDC может ассоциироваться с различными графическими объектами, кистями.
Неправильное использование HDC может вызвать нежелательные эффекты, такие как некорректное отображение графики. У меня возникали проблемы при создании нескольких самописных кнопок одного класса.
HDC может быть ассоциирован с различными режимами рендеринга, такими как GDI или Direct2D.
Чтобы HDC правильно работал надо учитывать развернуто ли приложение или нет. От этого тоже многое зависит. В win api свои приколы с этим.