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
непосредственно.