Как записать окно Direct3D / WPF / DWM в растровое изображение? - PullRequest
3 голосов
/ 09 января 2012

Обычный способ сделать снимок окна - это позвонить:

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

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

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

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

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

-John

1 Ответ

1 голос
/ 18 января 2012

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

EDIT:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...