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