2010-11-02 144 views
0

我已經構建了一個在本地Windows應用程序(MFC C++)中運行的C#COM類。 COM類用於在主應用程序的窗口句柄上顯示視頻。我使用.NET interop在我的C#應用​​程序中訪問DirectShow。在渲染圖形之後,我看到ActiveMovie窗口在它正確定位到窗口之前彈出。播放視頻文件時彈出DirectShow視頻窗口

下面是我如何設置圖形的示例。我沒有包括所有的代碼,但我認爲重要的部分包括在內 - 呈現圖表並設置窗口的所有者和位置。

 _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

調用順序爲我的作品時彈出一個窗口:

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);