Получение событий

[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует, чтобы новый код использовал MediaPlayer, IMFMediaEngine и аудио- и видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, использующий устаревшие API, чтобы по возможности использовать новые API.]

Диспетчер фильтров Graph предоставляет три интерфейса, поддерживающие уведомления о событиях.

  • IMediaEventSink содержит метод для фильтрации для публикации событий.
  • IMediaEvent содержит методы для получения событий приложениями.
  • IMediaEventEx наследует интерфейс IMediaEvent и расширяет его.

Фильтрует уведомления о событиях публикации, вызывая метод IMediaEventSink::Notify в диспетчере фильтра Graph. Уведомление о событии состоит из кода события, который определяет тип события, и двух параметров, которые предоставляют дополнительные сведения. В зависимости от кода события параметры могут содержать указатели, коды возврата, время ссылки или другие сведения. Полный список кодов событий и параметров см. в разделе Коды уведомлений о событиях.

Чтобы получить событие из очереди, приложение вызывает метод IMediaEvent::GetEvent в диспетчере Фильтров Graph. Этот метод блокируется до тех пор, пока не будет возвращено событие, или до истечения указанного времени. При условии, что событие в очереди, метод возвращает с кодом события и двумя параметрами события. После вызова GetEvent приложение должно всегда вызывать метод IMediaEvent::FreeEventParams , чтобы освободить все ресурсы, связанные с параметрами события. Например, параметр может быть значением BSTR , выделенным графом фильтра.

В следующем примере кода представлена схема извлечения событий из очереди.

long evCode;
LONG_PTR param1, param2;
HRESULT hr;
while (hr = pEvent->GetEvent(&evCode, &param1, &param2, 0), SUCCEEDED(hr))
{
    switch(evCode) 
    { 
        // Call application-defined functions for each 
        // type of event that you want to handle.
    } 
    hr = pEvent->FreeEventParams(evCode, param1, param2);
}

Чтобы переопределить обработку события по умолчанию диспетчером фильтров Graph, вызовите метод IMediaEvent::CancelDefaultHandling с кодом события в качестве параметра. Вы можете восстановить обработку по умолчанию, вызвав метод IMediaEvent::RestoreDefaultHandling . Если граф фильтров не выполняет обработку по умолчанию для указанного кода события, вызов этих методов не оказывает никакого влияния.

Уведомление о событиях в DirectShow