如何仅用代码[C#]创建AxHost
时间:2020-03-06 14:28:05 来源:igfitidea点击:
我正在使用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; ...
只要我在Windows Forms控件中托管此AxHost,一切都可以找到。但是我无法在构造函数中关联事件。
例如,这不起作用:
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 Forms的情况下实例化AxHost继承的控件,以在控制台应用程序中使用它呢?
谢谢
解决方案
仅供参考:没有人阻止我们在控制台应用程序中使用隐藏窗口。
我们将无法在需要托管的非Windows应用程序中托管媒体播放器。如果我们想播放一些音乐,则可以使用"媒体图"来创建一个渲染(播放)音乐文件的图,它不需要任何额外的托管。