1

我有一个 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(06 年 8 月)。我编译/链接了与 Vista SDK 一起打包的 DirectShow 内容,并且....没有骰子。

4

1 回答 1

1

我有一个解决方案。

视频流从没有消息泵的线程开始,这导致视频窗口变得无响应。(我想 XP 更能容忍这一点,也许 Vista 中的新显示驱动程序模型把它搞砸了。)无论如何,一旦我对主应用程序窗口执行了 SendMessage 并从那里开始视频捕获,一切似乎都正常!

于 2009-01-16T16:40:20.637 回答