共用方式為


擷取事件

[與此頁面 相關的功能 DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayerIMFMediaEngine音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議盡可能重寫使用舊版 API 的現有程式碼,以使用新的 API。]

Filter Graph 管理員會公開三個支援事件通知的介面。

在 Filter Graph 管理員上呼叫 IMediaEventSink::Notify 方法,以篩選事件後通知。 事件通知包含事件程式碼,可定義事件種類,以及提供其他資訊的兩個參數。 根據事件程式碼,參數可能包含指標、傳回碼、參考時間或其他資訊。 如需事件代碼和參數的完整清單,請參閱 事件通知代碼

若要從佇列擷取事件,應用程式會在 Filter Graph 管理員上呼叫 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 中的事件通知