显示筛选器的属性页

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

属性页是筛选器支持用户可以设置的属性的一种方式。 本文介绍如何在应用程序中显示筛选器的属性页。 有关属性页的详细信息,请参阅平台 SDK 文档。

注意

尽管 DirectShow 提供的许多筛选器支持属性页,但它们仅用于调试目的,不建议用于应用程序。 在大多数情况下,等效功能是通过筛选器上的自定义接口提供的。 应用程序应以编程方式控制这些筛选器,而不是向用户公开其属性页。

 

具有属性页的筛选器公开 ISpecifyPropertyPages 接口。 若要确定筛选器是否定义属性页,请使用 QueryInterface 查询此接口的筛选器。

如果通过调用 CoCreateInstance) 直接创建了筛选器 (的实例,则已有指向筛选器的指针。 如果没有,可以使用 IFilterGraph::EnumFilters 方法枚举图形中的筛选器。 有关详细信息,请参阅 枚举筛选器图中的对象

获得 ISpecifyPropertyPages 接口指针后,通过调用 ISpecifyPropertyPages::GetPages 方法检索筛选器的属性页。 此方法使用每个属性页的类标识符 (CLSID) 填充全局唯一标识符的计数数组 (GUID) 。 计数数组由 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 任务