質問

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 以外のアプリケーションでメディア プレーヤーをホストすることはできません。ホストする必要があります。音楽を再生したい場合は、メディア グラフを使用して音楽ファイルをレンダリング (再生) するグラフを作成できます。追加のホスティングは必要ありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top