BitBlt захватывает только частичный экран

Я пытаюсь захватить квадратную часть экрана с помощью GDI под Windows 10. Вот как я пытался:

//Get screen DC
desktop = GetDC(NULL);

//Create a compatible bitmap of 32 x 32 px.
HDC hCaptureDC = CreateCompatibleDC(desktop);
HBITMAP captureBmp = CreateCompatibleBitmap(hCaptureDC, 32, 32);
SelectObject(hCaptureDC, captureBmp);

//loop:
BitBlt(hCaptureDC, 0, 0, 32, 32, desktop, sourceX, sourceY, SRCCOPY);
BitBlt(desktop, 0, 0, 32, 32, hCaptureDC, 0, 0, SRCCOPY);

Таким образом, я фиксирую прямоугольник размером 32x32 пикселя в (sourceX, sourceY) в растровое изображение и нарисуйте его на экране (верхний левый угол).

Тем не менее, это приводит в основном к черным квадратам. Только вещи, которые были нарисованы GDI до захвата. Я совершенно уверен, что первый BitBlt это проблема. Если я укажу WHITENESS в качестве последнего параметра я получаю белый квадрат, чего я и ожидал. Таким образом, захват с экрана на растровое изображение кажется проблематичным.

Если я копирую прямо с экрана на экран, используя

BitBlt(desktop, 0, 0, 32, 32, desktop, sourceX, sourceY, SRCCOPY);

все работает как положено.

Я также попробовал флаг CAPTUREBLT,

Как я могу захватить весь регион в растровое изображение?

1 ответ

Решение

Эта линия

HBITMAP captureBmp = CreateCompatibleBitmap(hCaptureDC, 32, 32);

Должно быть

HBITMAP captureBmp = CreateCompatibleBitmap(desktop, 32, 32);

Причина объясняется на странице документации для CreateCompatibleBitmap:

При создании контекста устройства памяти изначально в нем выбирается монохромное растровое изображение 1 на 1. Если этот контекст устройства памяти используется в CreateCompatibleBitmap, созданное растровое изображение является монохромным растровым изображением. Чтобы создать цветное растровое изображение, используйте HDC, который использовался для создания контекста устройства памяти.

Другие вопросы по тегам