このところ、ずっと 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
やれやれ。
元来、仮説と検証の繰り返しは嫌いで無いが、この根気が何時まで続くやら。