BitBlt рисование черных квадратов (Windows 7)

Я создаю драйвер захвата виртуализации рабочего стола. По сути, драйвер открывает виртуализированный рабочий стол, захватывает экран в буфер растровых изображений и отправляет его клиенту, который затем перетаскивается на их экран (GetDIBits/SetDIBits).

Проблема в том, что проблема с PrintWindow в Windows 7. В Windows 8.1+ к этой функции добавлен дополнительный флаг PW_RENDERFULLCONTENT который рисует весь рабочий стол за один раз, однако в Windows 7 этот флаг не существует.

У меня вопрос, как я могу должным образом эмулировать это поведение флагов в Windows 7, чтобы все окна были нарисованы правильно. Например, без этого флага, когда хост-машина открывает Chrome на своем виртуализированном рабочем столе, PrintWindow вызов не выполняется, поскольку Chrome отображается с помощью Aura и PrintWindow не предназначен для работы с этой функциональностью, поэтому chrome рисуется с черным квадратом посередине:

образ

1 ответ

Быстрый тест показывает, что захват правильной области экрана дает правильные результаты. Код как это:

memDC.BitBlt(0, 0, src_rect.Width(), src_rect.Height(), 
             &screen, 
             src_rect.TopLeft().x, src_rect.TopLeft().y, 
             SRCCOPY | CAPTUREBLT);

... было достаточно, чтобы сделать снимок вашего вопроса, отображаемого в Chrome:

CAPTUREBLT рекомендуется, но не кажется действительно необходимым для этого конкретного случая. Этот код использует оболочку MFC вокруг BitBlt, но это не должно изменить ничего значительного по сравнению с вызовом BitBlt непосредственно.

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