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

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

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

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

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

Чтобы получить событие из очереди, приложение вызывает метод IMediaEvent::GetEvent в диспетчере графов фильтров. Этот метод блокирует до тех пор, пока не произойдет какое-либо событие для возврата или не истечет указанное время. Если имеется событие очереди, метод возвращается с кодом события и двумя параметрами события. После вызова 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);
}

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

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