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, который использовался для создания контекста устройства памяти.