Как захватить окно Direct3D/WPF/DWM в растровое изображение?

Обычный способ захватить изображение окна — вызвать:

HDC SharedWndDC = GetWindowDC(SharedWnd);
BitBlt(BitmapDC, 0, 0, width, height, SharedWndDC, 0, 0, SRCCOPY /* |CAPTUREBLT */);
ReleaseDC(SharedWnd, SharedWndDC);

Который в системе, работающей под управлением DWM, хорошо захватывает только рассматриваемое окно, даже если оно перекрывается другими окнами или частично за пределами экрана, или еще что-то.

Но он не работает правильно в некоторых окнах (предположительно тех, которые используют WPF) и делает забавные вещи со стеклянными областями. По сути, захват GDI не работает с вещами, не относящимися к GDI.

Я понимаю, что я действительно хочу захватить «задний буфер» или «передний буфер» Direct3D, но многочисленные примеры, которые я видел для этого, предназначены для захвата всего экрана или рабочего стола. Не зная Direct3D, я не могу найти пример или простое утверждение о том, как получить правильный объект для существующего окна, из которого я мог бы затем получить буферы.

Может ли какая-нибудь добрая душа хотя бы показать этот недостающий кусочек?

-Джон


person JDługosz    schedule 09.01.2012    source источник


Ответы (1)


Я не верю, что есть способ захватить содержимое переднего буфера без захвата всего экрана, а задний буфер является частным для приложения, работающего с Direct3D. Содержимое переднего буфера можно увидеть только тогда, когда видеокарта действительно представляет данные на мониторе. С помощью GDI Windows имеет доступ к переднему и заднему буферам, поскольку сама ими управляет. Но с Direct3D (и я предполагаю, что с WPF) это уже не так. Windows не имеет доступа к буферам и поэтому не может получить данные, если только приложение не передаст их Windows, что невозможно (для этого не определено сообщение).

РЕДАКТИРОВАТЬ:

Это похоже на мертвый вопрос, но я все равно добавлю его на случай, если кто-то еще придет искать ответы. Вышеупомянутые проблемы по-прежнему относятся к программному получению содержимого окна. Однако в Windows можно получить содержимое одного окна, используя сочетание клавиш ALT + Print Screen, когда окно, которое вы хотите захватить, имеет фокус клавиатуры (т. е. активное окно). Это может вам помочь, а может и нет, но оно фиксирует содержимое только рассматриваемого окна, даже с материалами DirectX.

person Alex    schedule 18.01.2012