3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

DirectShow(VB.NET)で描画時にユーザイベントを取得する方法

Panelコントロール内部で動画再生を行うコードをActiveMovie control type livraryを使って書いてますが、ユーザのマウスイベントとかが取得できなかった(Panelのイベントとして)でその方法を調べてみました。

'グラフマネージャの作成
Dim m_Grp As FilgraphManager = New FilgraphManager
m_Grp.RenderFile(m_strFilePath)
'IVideoWindowインターフェース取得
Dim VideoWindow As IVideoWindow = Nothing
VideoWindow = TryCast(m_Grp, IVideoWindow)
'描画領域のイベントをコントロールに渡す
VideoWindow.MessageDrain = CInt(Me.Handle)

上のコードをPanelを継承したカスタムコントロール内に書けばOKみたいです。
特に

VideoWindow.MessageDrain = CInt(Me.Handle)

が肝です。
これで、VideoWindowがとらえたイベントを指定したハンドルを持つコントロールに渡すことができるようです。

このカスタムコントロールをフォームにデザイナで配置して、下記のようにすれば正しくイベントを拾えました。

Private Sub mlt_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
    Handles mlt.MouseDown
    MsgBox("クリックされました。")
End Sub

なお、IVideoWindowで拾い、渡せるWin32メッセージは(IVideoWindow::put_MessageDrainと同じであれば)下記の分だけ出そうです。
参照:IVideoWindow::put_MessageDrain

WM_CHAR
WM_DEADCHAR
WM_KEYDOWN
WM_KEYUP
WM_LBUTTONDBLCLK
WM_LBUTTONDOWN
WM_LBUTTONUP
WM_MBUTTONDBLCLK
WM_MBUTTONDOWN
WM_MBUTTONUP
WM_MOUSEACTIVATE
WM_MOUSEMOVE
WM_NCLBUTTONDBLCLK
WM_NCLBUTTONDOWN
WM_NCLBUTTONUP
WM_NCMBUTTONDBLCLK
WM_NCMBUTTONDOWN
WM_NCMBUTTONUP
WM_NCMOUSEMOVE
WM_NCRBUTTONDBLCLK
WM_NCRBUTTONDOWN
WM_NCRBUTTONUP
WM_RBUTTONDBLCLK
WM_RBUTTONDOWN
WM_RBUTTONUP
WM_SYSCHAR
WM_SYSDEADCHAR
WM_SYSKEYDOWN
WM_SYSKEYUP