共用方式為


列舉效果和轉換

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

[此 API 不受支援,未來可能會變更或無法使用。]

DirectShow 提供用於列舉裝置 的系統裝置列舉值 物件。 您可以使用它來擷取使用者系統上所安裝效果或轉換的 Moniker。

系統裝置列舉值會公開 ICreateDevEnum 介面。 它會傳回指定裝置類別的類別列舉值。 類別列舉值接著會公開 IEnumMoniker 介面,並針對類別中的每個裝置傳回 Moniker。 如需使用 ICreateDevEnum的詳細討論,請參閱 列舉裝置和篩選。 以下是 DirectShow 編輯服務特有的簡短摘要。

若要列舉效果或轉換,請執行下列步驟。

  1. 建立系統裝置列舉值的實例。
  2. 呼叫 ICreateDevEnum::CreateClassEnumerator 方法來擷取類別列舉值。 類別是由類別識別碼所定義, (CLID) 。 將CLSID_VideoEffects1Category用於效果或轉換CLSID_VideoEffects2Category。
  3. 呼叫 IEnumMoniker::Next 以擷取列舉中的每個 Moniker。
  4. 針對每個 Moniker,呼叫 IMoniker::BindToStorage 以擷取其相關聯的屬性包。

屬性包包含效果或轉換的易記名稱和全域唯一識別碼 (GUID) 。 應用程式可以顯示易記名稱清單,然後取得對應的 GUID。

下列程式碼範例說明這些步驟。

ICreateDevEnum *pCreateDevEnum = NULL;
IEnumMoniker *pEnumMoniker = NULL;

// Create the System Device Enumerator.
HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, 
    CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (void**)&pCreateDevEnum);
if (FAILED(hr))
{
    // Error handling omitted for clarity.
}

// Create an enumerator for the video effects category.
hr = pCreateDevEnum->CreateClassEnumerator(
    CLSID_VideoEffects1Category,  // Video effects category. 
    &pEnumMoniker, 0);               

// Note: Use CLSID_VideoEffects2Category for video transitions.

if (hr == S_OK)  // S_FALSE means the category is empty.
{
    // Enumerate each video effect.
    IMoniker *pMoniker;
    while (S_OK == pEnumMoniker->Next(1, &pMoniker, NULL))
    {
        IPropertyBag *pBag;
        hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag, 
            (void **)&pBag);
        if(FAILED(hr))
        {
            pMoniker->Release();
            continue; // Maybe the next one will work.
        }
        VARIANT var;
        VariantInit(&var);
        hr = pBag->Read(OLESTR("FriendlyName"), &var, NULL);
        if (SUCCEEDED(hr))
        {
            if ( ... )  // Check if var.bstrVal is the name you want.
            {
                VARIANT var2;
                GUID guid;
                var2.vt = VT_BSTR;
                pBag->Read(OLESTR("guid"), &var2, NULL);
                CLSIDFromString(var2.bstrVal, &guid);
                VariantClear(&var2);
                // GUID is now the CLSID for the effect.
            }
        }
        VariantClear(&var);
        pBag->Release();
        pMoniker->Release();
    }
    pEnumMoniker->Release();
}
pCreateDevEnum->Release();

使用效果和轉換