DirectShow Video Window появляется при воспроизведении видео файла - PullRequest
0 голосов
/ 03 ноября 2010

Я создал класс C # COM, который работает в собственном приложении Windows (MFC C ++). Класс COM используется для отображения видео на дескрипторе окна из основного приложения. Я использую взаимодействие .NET для доступа к DirectShow в моем приложении C #. После рендеринга графика я вижу всплывающее окно 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 (), либо с настройкой владельца окна и положения окна. Я возился с порядком вызовов функций, и, похоже, ничего не помогает. Важно отметить, что вы не можете получить интерфейс IVideoWindow до тех пор, пока не вызовете Render () в IGraphBuilder. Мне нужно избавиться от всплывающего окна! Кто-нибудь еще видел эту проблему? Или у кого-нибудь есть идеи о том, что его вызывает? Любая помощь будет принята с благодарностью.

Спасибо, Dan

1 Ответ

0 голосов
/ 04 ноября 2010

Эта последовательность вызовов работает у меня без всплывающего окна:

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