Decided so far with the help of gdi32:
void CaptureScreen(){ // Определение контекстов HDC ScreenDC = GetDC(0); HDC MemoryDC = CreateCompatibleDC(ScreenDC); // Фиксация размеров экрана int ScreenWidth = GetSystemMetrics(SM_CXSCREEN); int ScreenHeight = GetSystemMetrics(SM_CYSCREEN); // Создание и частичное заполнение структуры формата BITMAPINFO BMI; BMI.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); BMI.bmiHeader.biWidth = ScreenWidth; BMI.bmiHeader.biHeight = -ScreenHeight; // Отрицательное значение высоты, чтобы изображение не было перевёрнутым BMI.bmiHeader.biSizeImage = ScreenWidth * ScreenHeight * 3; // Ширина * Высота * Количество_цветов_на_пиксель BMI.bmiHeader.biCompression = BI_RGB; BMI.bmiHeader.biBitCount = 24; BMI.bmiHeader.biPlanes = 1; ScreenshotSize = BMI.bmiHeader.biSizeImage; // ScreenshotSize - глобальная переменная типа int, может меняться в ходе выполнения программы unsigned char *ImageBuffer; // Указатель на блок данных BGR, управляемый HBITMAP (да, именно BGR - не RGB) HBITMAP hBitmap = CreateDIBSection(ScreenDC,&BMI,DIB_RGB_COLORS,(void**)&ImageBuffer,0,0); SelectObject(MemoryDC, hBitmap); BitBlt(MemoryDC, 0, 0, ScreenWidth, ScreenHeight, ScreenDC , 0, 0, SRCCOPY); // Контексты больше не нужны DeleteDC(MemoryDC); ReleaseDC(NULL, ScreenDC); // Если требуется RGB вместо BGR - следующий цикл перевернёт нужные байты for(int i = 0; i < ScreenshotSize; i += 3){ unsigned char ColorValue = ImageBuffer[i]; ImageBuffer[i] = ImageBuffer[i + 2]; ImageBuffer[i + 2] = ColorValue; } // Используем ImageBuffer как нам хочется... после удаляем его хендлер (HBITMAP) для избежания утечки памяти DeleteObject(hBitmap); }
Faster, probably, will be only DirectX or OpenGL, but with the latter there was already an unsuccessful screenshot experience, and I don’t yet know how to get data directly from the graphical output
getDC(0)- gives the screen context and can be copied. Here is an example of cyberforum.ru/win-api/thread877306.html in nete. - nick_n_a February