VBA で動画再生

by

in

 このところ、ずっと VBA for Excel で Windows Media Player をコントロールするプログラムにはまっていた。
 言語に関わらず Windows Media Player の制御に関する情報が少ない。いわんや VBA をや。そして、稀に情報があったとしても、私のやりたい事にフィットするものがない、あるいはガセだったりする(泣)。という訳で結構苦労した。
 具体的には、動画ファイルをユーザーフォームに貼り付けて、一定のインターバルでユーザーフォームのスナップショットをとるというのが今回の課題。肝は何時でもユーザーフォームを一定の大きさ・位置を表示するという事。
 動画を再生するユーザーフォームの関数を play として、次のように各種のプロパティ―を所定の値にセットすれば良い(楽勝!)・・・という訳にいかんのですよコレが !?

Private Sub play()

    Me.Caption = m_caption
    Me.Show vbModeless
    Me.StartUpPosition = 0
    Me.Top = 0
    Me.Left = Windows(1).Left + 300
    Me.Height = m_player_height
    Me.Width = m_player_width

    With Me.WindowsMediaPlayer1
        .uiMode = "none"
        .settings.autoStart = False
        .settings.Rate = m_speed
        .Url = m_src_path
        .Top = 0
        .Left = 0
        .Height = m_player_height
        .Width = m_player_width
        .stretchToFit = True
        .Controls.play
    End With

End Sub

 正しくは StatusChange イベントを拾って、言う事をきくまでシツコク設定しないと反映されない。こんな大事なことが本家のドキュメントですら書いてないんですよ。困ったもんだ。
 デバッグの知見から WindowsMediaPlayer1.playState が 3 になった段階でセットすれば良い、という説もあるけど、油断ならんのでこのままにしている。

Private Sub WindowsMediaPlayer1_StatusChange()

    Me.StartUpPosition = 0
    Me.Top = 0
    Me.Left = Windows(1).Left + 300
    Me.Height = m_player_height
    Me.Width = m_player_width

    With Me.WindowsMediaPlayer1
        .Visible = False
        .Top = 0
        .Left = 0
        .Height = m_player_height
        .Width = m_player_width
        .stretchToFit = True
        .Visible = True
    End With

End Sub

 やれやれ。
 元来、仮説と検証の繰り返しは嫌いで無いが、この根気が何時まで続くやら。