次の方法で共有


イベントの取得

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

Filter Graph Manager は、イベント通知をサポートする 3 つのインターフェイスを公開します。

  • IMediaEventSink には、イベントをポストするフィルターのメソッドが含まれています。
  • IMediaEvent には、アプリケーションがイベントを取得するためのメソッドが含まれています。
  • IMediaEventEx は IMediaEvent インターフェイスを継承し、 拡張 します。

フィルター グラフ マネージャーで IMediaEventSink::Notify メソッドを呼び出して、イベント通知後にフィルター処理します。 イベント通知は、イベントの種類を定義するイベント コードと、追加情報を提供する 2 つのパラメーターで構成されます。 イベント コードによっては、パラメーターにポインター、リターン コード、参照時刻、またはその他の情報が含まれている場合があります。 イベント コードとパラメーターの完全な一覧については、「 イベント通知コード」を参照してください。

キューからイベントを取得するために、アプリケーションは Filter Graph Manager で IMediaEvent::GetEvent メソッドを呼び出します。 このメソッドは、返すイベントが発生するまで、または指定した時間が経過するまでブロックします。 キューに登録されたイベントがあると仮定すると、メソッドはイベント コードと 2 つのイベント パラメーターを使用して を返します。 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);
}

イベントに対する Filter Graph Manager の既定の処理をオーバーライドするには、イベント コードをパラメーターとして 使用して IMediaEvent::CancelDefaultHandling メソッドを呼び出します。 IMediaEvent::RestoreDefaultHandling メソッドを呼び出すことで、既定の処理を再開できます。 フィルター グラフで、指定したイベント コードに対して既定の処理が実行されない場合、これらのメソッドの呼び出しは無効です。

DirectShow でのイベント通知