Hatena::ブログ(Diary)

あれとアレを足して2で割る

2008-02-27 WindowsMediaPlayerで再生中の楽曲情報にアクセスする(後編) このエントリーを含むブックマーク

やあどうも。punidamaです。

今回はWindowsMediaPlayer(以下WMP)で再生している楽曲情報を取得するにはどうすればいいかの後編です。

前編では、何かあんまり本題と関係ないことを言ってるような感じでしたが、実は意外と効いてきます。

ということで、早速。

WindowsMediaPlayerのしくみ

WMPは2種類の使い方(動かし方?)ができます。この呼び方はオフィシャルなものではありません。今回、便宜的に名前をつけています。

エンベッドモード

一つ目のパターンは、エンベッドモード。簡単に言うと、前編で紹介した方法です。

単純に音楽とか動画を再生したいときに使うやり方です。

ちなみに、前回みたいなまどろっこしいやり方ではなく、wmp.dllを参照設定してさっくりと使いたい場合であれば、ここを見てください。

Using the Windows Media Player Control in a .NET Framework Solution

リモートモード

リモートモードとは、自分とは関係ないところでエンベッドモードでWMPを動かしておいて、必要なときにリモートでちょっかいをかけにいくというやり方です。

この使い方では、アプリケーションとして動いているWMPに対して、何を再生しているかを取りに行くという、今回のお題に沿った使い方になります。でも、C#からは簡単には使えません。

第二の関門

前編では一番最初にWMPのリファレンスを載せておきました。

Windows Media Player 11 SDK

これを読み進めていくと

Player Object Model for Scripting Languages

の中に

PlayerApplication Object

というのがあります。つまり、

PlayerApplication foo = IWMPRemoteMediaServices.Player;//雰囲気的にこんな感じ

とやると、アプリケーションとしてのWMPにアクセスできます。

「おい、ふざけるな。前編はなんだったんだ!」という人がいたら落ち着いてください。これ、C#からは使えないんです。

ちゃんとこのドキュメントを見ると

This object is used only with C++ programs that implement the IWMPRemoteMediaServices interface and embed the Player control in remote mode.

と書いてあります。これ、C++からしか使えないんです。

つまり、IWMPRemoteMediaServices.PlayerをどうにかこうにかしてC#から使えるようにしなければならないというのが第二の関門です。

C#でラッピング

で、ここから一気に他力本願になるわけですが、USのMSDNでEric Gunnersonがこんなことを書いていました。

Remotable Windows Media Player in C#

おお、やりたいことまんまだ!!!で、リンク先にあるUSのGotDotNetのサイトにC#でラッピングされたJonathan Dibbleによるコードがあったのですが、GotDotNetのサイトもろともなくなってしまいました。

そこで、私がサイト消滅前に確保しておいたソースを上げておきます。

http://sirayuki.sakura.ne.jp/WmpSample/WmpRemote.zip *1

この中にあるRemotedWindowsMediaPlayer.csがリモートで動いているアプリケーションのWMPをラッピングしているオブジェクトになります。雰囲気としては、前編で紹介したaximpが出力したソースと似てはいますが、おそらく全部手で組んだと思われるので、その苦労ときたらお察し申し上げますとしかいえません。

で、アプリケーションのWMPで何かを再生しながらこのソースをビルドして動かすと、アプリケーションのWMP側で再生されているものが一時停止できたり、スライダーを動かすとその部分を再生したりできることが確認できるかと思います。

あとは

Player Object Model for Scripting Languages

を参考にして、RemotedWindowsMediaPlayerをムニャムニャすれば、アプリケーションのWMPの情報に触ることが可能になります。

まとめ

最後はかなり他力本願でスイマセン。

Jonathan Dibbleのコードですが、手で書くのは大変です。良くぞここまでやったなあという感じです。

ということで、リモートのWMPに触りたいときはJonathanのコードを参考にしましょう!(コンナケツロンデイイノカヨ!)

 

*1:これ自体はVisualStudio2003のプロジェクトですが、2005でも動きました。しかし、ソースにも書いてあるとおりAsIsで提供されているため保証の限りではありません。また、基本的に他人のソースなので、クレームがあった場合削除します。

dpaladindpaladin 2010/04/06 11:33 ありがとう