Я провел некоторое исследование через Интернет и нашел полезный код. Я изменил его немного, в попытке захватить весь экран и генерировать буфер, который я могу отправить через UDP пакетов:Снимки экрана не могут захватить весь экран с использованием C++ и GDI
#include <iostream>
#include <Windows.h>
#include <fstream>
void CapruteScreenAndSaveToFile()
{
uint16_t BitsPerPixel = 24;
uint32_t Width = GetSystemMetrics(SM_CXSCREEN);
uint32_t Height = GetSystemMetrics(SM_CYSCREEN);
// Create Header
BITMAPFILEHEADER Header;
memset(&Header, 0, sizeof(Header));
Header.bfType = 0x4D42;
Header.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
// Create Info
BITMAPINFO Info;
memset(&Info, 0, sizeof(Info));
Info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
Info.bmiHeader.biWidth = Width;
Info.bmiHeader.biHeight = Height;
Info.bmiHeader.biPlanes = 1;
Info.bmiHeader.biBitCount = BitsPerPixel;
Info.bmiHeader.biCompression = BI_RGB;
Info.bmiHeader.biSizeImage = Width * Height * (BitsPerPixel > 24 ? 4 : 3);
// Capture screen and save to Pixels
char* Pixels = NULL;
HDC MemDC = CreateCompatibleDC(0);//Context);
HBITMAP Section = CreateDIBSection(MemDC, &Info, DIB_RGB_COLORS, (void**)&Pixels, 0, 0);
DeleteObject(SelectObject(MemDC, Section));
BitBlt(MemDC, 0, 0, Width, Height, GetDC(0), 0, 0, SRCCOPY);
DeleteDC(MemDC);
// Concatenate everything
char * buffer = (char*)malloc(sizeof(Header) + sizeof(Info.bmiHeader) + (((BitsPerPixel * Width + 31) & ~31)/8) * Height);
memcpy(buffer, (char*)&Header, sizeof(Header));
memcpy(buffer + sizeof(Header), (char*)&Info.bmiHeader, sizeof(Info.bmiHeader));
memcpy(buffer + sizeof(Header) + sizeof(Info.bmiHeader), Pixels, (((BitsPerPixel * Width + 31) & ~31)/8) * Height);
// Save to file
std::fstream hFile("Foo.bmp", std::ios::out | std::ios::binary);
hFile.write(buffer, sizeof(Header) + sizeof(Info.bmiHeader) + (((BitsPerPixel * Width + 31) & ~31)/8) * Height);
// Clean up
hFile.close();
DeleteObject(Section);
free(buffer);
}
int main()
{
CapruteScreenAndSaveToFile();
return 0;
}
Но это только кажется, чтобы захватить эту часть моего рабочего стола:
И это несмотря на то, что я использую CreateCompatibleDC (0).
я тестировал код на моем компьютере. Он работает нормально. Созданный «bmp» имеет полноэкранный захват. – Naidu
Не забывайте, что существует [SetWindowDisplayAffinity] (https://msdn.microsoft.com/en-us/library/windows/desktop/dd375340.aspx), а также OpenGL. Оба могут представлять собой препятствие для вашего кода и заставить его потерпеть неудачу. Не проблема, которую вы пытаетесь решить здесь, но что-то, с чем вы неизбежно столкнетесь. – IInspectable