次の方法で共有


効果と遷移の列挙

[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayerIMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayerIMFMediaEngineAudio/Video Capture を使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]

[この API はサポートされていないため、今後変更または使用できない可能性があります。]

DirectShow には、 デバイスを列挙するための System Device Enumerator オブジェクトが用意されています。 これを使用して、ユーザーのシステムにインストールされている効果または切り替え用のモニカーを取得できます。

システム デバイス列挙子は 、ICreateDevEnum インターフェイスを公開します。 指定したデバイス カテゴリのカテゴリ列挙子を返します。 カテゴリ列挙子は、 IEnumMoniker インターフェイスを公開し、カテゴリ内の各デバイスのモニカーを返します。 ICreateDevEnum の使用の詳細については、「デバイスとフィルターの列挙」を参照してください。 DirectShow Editing Services に固有の簡単な概要を次に示します。

効果または遷移を列挙するには、次の手順を実行します。

  1. システム デバイス列挙子のインスタンスを作成します。
  2. ICreateDevEnum::CreateClassEnumerator メソッドを呼び出して、カテゴリ列挙子を取得します。 カテゴリは、クラス識別子 (CLSID) によって定義されます。 効果にはCLSID_VideoEffects1Category、切り替えにはCLSID_VideoEffects2Categoryを使用します。
  3. 列挙体の各モニカーを取得するには、 IEnumMoniker::Next を呼び出します。
  4. モニカーごとに 、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();

効果と画面切り替えの操作