顯示篩選的屬性頁

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

屬性頁是篩選支援使用者可以設定之屬性的其中一種方式。 本文說明如何在應用程式中顯示篩選的屬性頁。 如需屬性頁的詳細資訊,請參閱 Platform SDK 檔。

注意

雖然許多隨附 DirectShow 支援屬性頁的篩選,但它們僅供偵錯之用,不建議用於應用程式使用。 在大部分情況下,對等的功能是透過篩選上的自訂介面來提供。 應用程式應該以程式設計方式控制這些篩選,而不是向使用者公開其屬性頁。

 

具有屬性頁的篩選準則會公開 ISpecifyPropertyPages 介面。 若要判斷篩選是否定義屬性頁,請使用 QueryInterface查詢此介面的篩選。

如果您藉由呼叫 CoCreateInstance) 直接建立篩選 (實例,則您已經有篩選的指標。 如果沒有,您可以使用 IFilterGraph::EnumFilters 方法列舉圖形中的篩選。 如需詳細資訊,請參閱 列舉篩選圖形中的物件

一旦您擁有 ISpecifyPropertyPages 介面指標,請呼叫 ISpecifyPropertyPages::GetPages 方法來擷取篩選的屬性頁。 這個方法會以每個屬性頁的 CLSID ( (CLSID) 類別識別碼填入全域唯一識別碼) 的全域唯一識別碼陣列。 計算陣列是由 CAUUID 結構所定義,您必須配置,但不需要初始化。 GetPages方法會配置陣列,此陣列包含在CAUUID結構的pElems成員中。 完成時,請呼叫 CoTaskMemFree 函式以釋放陣列。

OleCreatePropertyFrame函式提供簡單的方法,可在強制回應對話方塊中顯示內容頁。

IBaseFilter *pFilter;
/* Obtain the filter's IBaseFilter interface. (Not shown) */
ISpecifyPropertyPages *pProp;
HRESULT hr = pFilter->QueryInterface(IID_ISpecifyPropertyPages, (void **)&pProp);
if (SUCCEEDED(hr)) 
{
    // Get the filter's name and IUnknown pointer.
    FILTER_INFO FilterInfo;
    hr = pFilter->QueryFilterInfo(&FilterInfo); 
    IUnknown *pFilterUnk;
    pFilter->QueryInterface(IID_IUnknown, (void **)&pFilterUnk);

    // Show the page. 
    CAUUID caGUID;
    pProp->GetPages(&caGUID);
    pProp->Release();
    OleCreatePropertyFrame(
        hWnd,                   // Parent window
        0, 0,                   // Reserved
        FilterInfo.achName,     // Caption for the dialog box
        1,                      // Number of objects (just the filter)
        &pFilterUnk,            // Array of object pointers. 
        caGUID.cElems,          // Number of property pages
        caGUID.pElems,          // Array of property page CLSIDs
        0,                      // Locale identifier
        0, NULL                 // Reserved
    );

    // Clean up.
    pFilterUnk->Release();
    FilterInfo.pGraph->Release(); 
    CoTaskMemFree(caGUID.pElems);
}

基本 DirectShow 工作