Непонятно, понятно из вашего ответа, что это MFCaptureManager
, но по коду SetRenderHandle(m_hwnd)
я вижу, что вы используете IMFCapturePreviewSink::SetRenderHandle
. Итак, я могу сказать, что я столкнулся с подобной проблемой некоторое время назад, и это связано с различием между старой оконной системой, существующей в WinXP, и текущей оконной системой в Vista. Код устанавливает контекст окна для средства визуализации, вызывая IMFCapturePreviewSink::SetRenderHandle
- для IMFCapturePreviewSink это DirectX11 - и DirectX11 получил полный доступ к окну и переключается на текущую оконную систему. В результате любой вызов fill the window by black brush and draw some text
, который выполняется старым Windows API из поколения Win95-XP, ничего не делает - потому что контекст обработчика окна заблокирован DirectX11.
Существует три способа решения этой проблемы:
- Создать новый пользовательский интерфейс с помощью нового API-интерфейса Microsoft DirectComposition, основанного на DirectX11, и установить для него значение IMFCapturePreviewSink :: SetRenderSurface .
- Создать EVR Media Sink с помощью MFCreateVideoRenderer - он создает видео рендерер DirectX9, совместимый со старым Windows API из поколения Win95-XP, и задает этот
IMFMediaSink
в IMFCapturePreviewSink :: SetCustomSink .
- Создайте код видео рендерера на основе DirectX9 - например, MFCaptureD3D / device.cpp и извлеките необработанный IMFSample из обратного вызова IMFCapturePreviewSink :: SetSampleCallback .
Привет.