我已经构建了一个在本机Windows应用程序(MFC C ++)中运行的C#COM类。 COM类用于在主应用程序的窗口句柄上显示视频。我正在使用.NET interop在我的C#应用程序中访问DirectShow。渲染图形后,我看到ActiveMovie窗口在正确放置在窗口中之前会弹出。
以下是我如何设置图表的示例。我没有包含所有代码,但我认为重要的部分包括 - 渲染图形并设置窗口所有者和位置。
_graphBuilder = (IGraphBuilder)new FilgraphManager();
_sourceFilter = (IBaseFilter)Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID.AsyncReader));
hr = ((IFileSourceFilter)_sourceFilter).Load(fileName, null);
DSUtilities.ThrowExceptionForHR(hr);
hr = _graphBuilder.AddFilter(_sourceFilter, "AsyncReader");
DSUtilities.ThrowExceptionForHR(hr);
IPin output = DSUtilities.FindPinByDirection(_sourceFilter, _PinDirection.PINDIR_OUTPUT, 0);
// add some other filters
// ...
_graphBuilder.Render(output);
_videoWindow = (IVideoWindow)_graphBuilder;
_videoWindow.WindowStyle = (int)(WindowStyle.Child | WindowStyle.ClipChildren);
_videoWindow.SetWindowPosition(_viewer.VideoRectangle.Left, _viewer.VideoRectangle.Top, _viewer.VideoRectangle.Width, _viewer.VideoRectangle.Height);
_videoWindow.Owner = viewer.CanvasHandle.ToInt32();
我认为这个问题与_graphBuilder.Render()调用或设置窗口所有者和窗口位置有关。我已经弄乱了函数调用的顺序,似乎没有任何帮助。需要注意的一件重要事情是,在IGraphBuilder上调用Render()之后才能获取IVideoWindow接口。我需要摆脱弹出窗口!还有其他人看过这个问题吗?或者有没有人对导致它的原因有任何想法?任何帮助将不胜感激。
谢谢, 丹
答案 0 :(得分:0)
这一系列的调用对我有用而不会弹出一个窗口:
pGraph->RenderFile(fname, NULL);
pGraph->QueryInterface( IID_IVideoWindow, (void**) &pVidWindow);
pVidWindow->put_Owner((OAHWND)hwnd);
pVidWindow->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS);
pVidWindow->SetWindowPosition(0, 0, grc.right, grc.bottom);
pVidWindow->put_MessageDrain( (OAHWND)hwnd );
pVidWindow->put_Visible(OATRUE);