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

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

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

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

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

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

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

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

Изменить: при захвате, например, VLC, я получаю следующее:  введите описание изображения здесь

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

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


person Gediminas    schedule 26.04.2019    source источник
comment
Какую технологию использует приложение? Это не работает только в приложениях UWP? API эскизов DWM работает или он тоже пуст?   -  person Anders    schedule 26.04.2019
comment
@Anders Я тестировал с помощью windows Calculator.exe. Миниатюра DWM может захватывать и показывать дублированное изображение миниатюры в моем окне. Но DwmGetDxSharedSurface (User32.dll) не работает с указанной ошибкой.   -  person Gediminas    schedule 26.04.2019
comment
Вы нашли решение? У меня такая же проблема   -  person user1428926    schedule 19.04.2020
comment
@ user1428926 Я не знал, пожалуйста, дайте мне знать.   -  person Gediminas    schedule 19.04.2020
comment
@Gediminas, у вас еще есть код для DwmGetDxSharedSurface () или DwmpDxGetWindowSharedSurface ()   -  person trickymind    schedule 28.07.2021
comment
@trickymind, взгляни: pastebin.com/i9ibFX99 Это просто старый экспериментальный мусорный код. Надеюсь, ты найдешь что-нибудь полезное.   -  person Gediminas    schedule 28.07.2021
comment
@Gediminas Большое спасибо за помощь, я неделю бродил по Интернету, чтобы получить образец кода этой функции Dwm.   -  person trickymind    schedule 29.07.2021


Ответы (1)


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

person malcev    schedule 15.09.2020
comment
Спасибо. Я не знал о флаге PW_RENDERFULLCONTENT (nFlags = 2). Информации об этом в документации PrintWindow нет. - person Gediminas; 15.09.2020