イベントをウィンドウ メッセージとして通知するように設定 (IMediaEventEx)

IMediaEventを拡張し、アプリケーション ウィンドウでメッセージを受け取れる用にするメソッドを備えます。

IMediaEventExインターフェイスの作成

IGraphBuilderのインスタンスから、キャストする形式で作成します。

IMediaEventEx mediaEventEx = null;

mediaEventEx = ( IMediaEventEx )graphBuilder;

イベント通知を処理するウィンドウの登録 (SetNotifyWindow)

ウィンドウのハンドルをSetNotifyWindow()メソッドに渡すことで、ウィンドウを登録します。

// フィルタ グラフ イベントのメッセージ取得に使用するID
const int WM_GRAPHNOTIFY = 0x8000 + 1;

mediaEventEx.SetNotifyWindow( this.Handle, WM_GRAPHNOTIFY, IntPtr.Zero );

SetNotifyWindowの構文は、

int SetNotifyWindow(
    IntPtr hwnd,            // ウィンドウのハンドル
    int lMsg,               // 通知として渡すウィンドウ メッセージID
    IntPtr lInstanceData    // 通知として渡すウィンドウ メッセージのlParamとして渡す値
    );

のようになっています。

イベント通知の取得

WndProc()メソッドをオーバーライドして、その引数のメッセージが登録したイベントのIDならば、フィルタ グラフのイベントとして処理します。

protected override void WndProc( ref System.Windows.Forms.Message m )
{
    switch( m.Msg )
    {
        // フィルタ グラフ イベント
        case WM_GRAPHNOTIFY:

            EventCode evCode;
            IntPtr evParam1;
            IntPtr evParam2;

            while( mediaEventEx.GetEvent( out evCode, out evParam1, out evParam2, 0 ) == 0 )
            {
                // イベントのパラメータを解放する
                int hr = mediaEventEx.FreeEventParams( evCode, evParam1, evParam2 );
                DsError.ThrowExceptionForHR( hr );


                // 必要ならば、ここにイベントを処理するコードを追加する
            }

            break;
    }

    base.WndProc( ref m );
}

イベント通知をイベント キューから取得するにはGetEvent()メソッドを使用します。

int GetEvent(
    out EventCode lEventCode,   // イベント コードを受け取る変数
    out IntPtr lParam1,         // イベントの第1引数を受け取る変数
    out IntPtr lParam2,         // イベントの第2引数を受け取る変数
    int msTimeout               // タイムアウト時間 [ms]
    );
IMediaEvent::GetEvent | MSDN

イベントに関連付けられたリソースの解放

GetEvent()メソッドでイベントを取得したときには、必ずFreeEventParamsでリソースを解放しなければなりません。

int FreeEventParams(
    EventCode lEvCode,  // イベント コード
    IntPtr lParam1,     // イベントの第1引数
    IntPtr lParam2      // イベントの第2引数
    );
IMediaEvent::FreeEventParams | MSDN