2

COM ラッパーを使用して Windows Media Player とやり取りしています。

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 を継承したコントロールをインスタンス化するにはどうすればよいでしょうか。

4

1 に答える 1

1

参考までに: コンソール アプリケーションで隠しウィンドウを使用することを誰も止めません。

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

于 2008-09-20T01:02:19.687 に答える