IMediaEventを拡張し、アプリケーション ウィンドウでメッセージを受け取れる用にするメソッドを備えます。
IGraphBuilderのインスタンスから、キャストする形式で作成します。
IMediaEventEx mediaEventEx = null; mediaEventEx = ( IMediaEventEx )graphBuilder;
ウィンドウのハンドルを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