Снимок экрана конкретного окна (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.