Снимок экрана конкретного окна (HWND, HW ускорены)

Мне нужно сделать снимки / скриншоты определенного окна (HWND), использующего ускорение HW, и записать их в видеопоток.

При использовании BitBlt или же PrintWindow Я могу захватывать данные изображения только в том случае, если это окно не HW ускорено, иначе я получаю черную текстуру.

Попытка использования недокументированного User32.dll DwmGetDxSharedSurface чтобы получить ручку поверхности DirectX. Но это не с ошибкой:

ERROR_GRAPHICS_PRESENT_REDIRECTION_DISABLED - подсистема управления окнами рабочего стола выключена

(Изменить: не работает для определенных приложений, например "calculator.exe")

Попытка с использованием недокументированных функций Dwmapi.dll DwmpDxUpdateWindowSharedSurface а также DwmpDxGetWindowSharedSurface, Мне удалось получить то, что выглядит как действительный дескриптор поверхности DirectX. (это d3dFormat, информация о ширине и высоте действительна) Dx's OpenSharedResource не жаловался и сумел создать действительный ID3D11Texture2D, Проблема в том, что все байты являются нулями (получая черную текстуру). Я мог бы сделать что-то здесь не так или.. недокументированные функции DWM больше не работают в Windows 10...

Изменить: я могу получить данные изображения для некоторых приложений, таких как Windows Explorer, Paint и т. Д., Но для некоторых, таких как Slack, я получаю все нули / черное изображение.

Изменить: при захвате т.е. VLC, я получаю это:

Вопрос: Есть ли другой способ захвата данных изображения ускоренного окна HW?

Примечание: я не хочу захватывать весь рабочий стол.

0 ответов

Вы можете использовать PrintWindow с nFlags=2 или использовать Magnification API (исключить окна) или попробовать взломать dwm.exe.

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