質問
Windows Media Player と対話するために COM ラッパーを使用しています。
AxHost を使用して何らかの方法でプレイヤーをラップしていますが、私にとってそれはすべて内部の魔法にすぎません ^^
AxHost.AttachInterfaces は次のようになります
protected override void AttachInterfaces()
{
try
{
//Get the IOleObject for Windows Media Player.
IOleObject oleObject = this.GetOcx() as IOleObject;
//Set the Client Site for the WMP control.
oleObject.SetClientSite(this as IOleClientSite);
Player = this.GetOcx() as WMPLib.WindowsMediaPlayer;
...
この AxHost を Windows フォーム コントロールでホストしている限り、すべてが機能しています。しかし、コンストラクターでイベントを接続することはできません。
たとえば、これは機能しません:
public WMPMediaRating()
{
var remote = new WMPRemote.RemotedWindowsMediaPlayer();
_WMP = remote.Player;
_WMP.MediaChange += new _WMPOCXEvents_MediaChangeEventHandler(_WMP_MediaChange);
}
Remote.Player は常に null であり、プログラムは NullReferencesException でクラッシュします。
AttachInterfaces() のコードは、どういうわけか、フォームが描画された後、または他のすべてが完了した後にのみ実行されます。
AttachInterfaces() を手動で呼び出してみましたが、GetOcx() が何も返さないため、それも機能しませんでした。
では、Windows フォームを使用せずに AxHost 継承コントロールをインスタンス化し、たとえばコンソール アプリケーションで使用するにはどうすればよいでしょうか?
解決
ご参考までに:コンソール アプリケーションで非表示ウィンドウを使用することを誰も止めません。
Windows 以外のアプリケーションでメディア プレーヤーをホストすることはできません。ホストする必要があります。音楽を再生したい場合は、メディア グラフを使用して音楽ファイルをレンダリング (再生) するグラフを作成できます。追加のホスティングは必要ありません。
所属していません StackOverflow