我有一个CView,我想托管一个DirectShow渲染器。
我没有写原始代码,我只是清理并将代码移动到VS2005。这需要升级某些第三方工具,因此我试图在不完全了解DX / DirectShow的情况下稍微更改代码。
问题是我的应用程序在我运行时挂起
hr = gcap.pFg->QueryInterface(IID_IVideoWindow, (void **)&gcap.pVW);
[trimmed some code]
gcap.pVW->put_Owner((OAHWND) m_pDockWnd->GetSafeHwnd()); // We own the window now
m_pDockWnd是CView。我可以在预览模式下执行此操作,但在捕获模式下则不能执行此操作。在捕获模式下,它会挂起应用程序。
如果我不拥有渲染窗口,则没有问题(虽然捕获窗口归桌面所有,但对我来说无效)。
此外,捕获窗口显示一个忙碌的光标,当它由桌面拥有时 - 可能它实际上也没有工作,但它至少不会挂起应用程序。挂起我的意思是应用程序不响应用户输入,但后台线程继续运行。
更新:我们使用的是旧版DirectX(2006年8月)。我编译/链接了与Vista SDK一起打包的DirectShow东西......没有骰子。
答案 0 :(得分:1)
我已经得到了解决方案。
视频流从没有消息泵的线程开始,这导致视频窗口无响应。 (我猜XP更容忍这个,也许Vista中新的显示驱动程序模型搞砸了。)无论如何,一旦我将SendMessage发送到主应用程序窗口并从那里开始视频捕获,一切似乎都有效!