イベントの取得
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/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, ¶m1, ¶m2, 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 メソッドを呼び出すことで、既定の処理を再開できます。 フィルター グラフで、指定したイベント コードに対して既定の処理が実行されない場合、これらのメソッドの呼び出しは無効です。
関連トピック