检索事件

[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 MediaPlayerIMFMediaEngine音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]

Filter Graph 管理器公开三个支持事件通知的接口。

通过在 Filter Graph 管理器上调用 IMediaEventSink::Notify 方法筛选事件通知。 事件通知由一个定义事件类型的事件代码和两个提供其他信息的参数组成。 根据事件代码,参数可能包含指针、返回代码、引用时间或其他信息。 有关事件代码和参数的完整列表,请参阅 事件通知代码

若要从队列中检索事件,应用程序在 Filter Graph Manager 上调用 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);
}

若要替代 Filter Graph 管理器对事件的默认处理,请使用事件代码作为参数调用 IMediaEvent::CancelDefaultHandling 方法。 可以通过调用 IMediaEvent::RestoreDefaultHandling 方法来恢复默认处理。 如果筛选器图未对指定的事件代码执行默认处理,则调用这些方法不起作用。

DirectShow 中的事件通知