我认为这篇文章和我的问题相同。然而,对于我的情况没有可行的解决方案。
我在我的程序中使用Windows Media Player ActiveX。
由于某些原因,我不想添加它的引用并通过IDE自动转换为AxHost。
我通过
我检查了
这些代码编译得很好,我可以加载一些音乐,播放,暂停,...做任何我想做的事情。
但是
我尝试在
当运行
这些信息已经用繁体中文写出来了,我认为它的意思是:
那么,如何在动态对象
对我来说,任何可能的解决方案(如
另外,在上面的情况下,
但是,如果我想处理
我希望解决方案也适用于此情况。
提前感谢大家的支持,并请原谅我拙劣的英语。
我在我的程序中使用Windows Media Player ActiveX。
由于某些原因,我不想添加它的引用并通过IDE自动转换为AxHost。
我通过
Activator
和ProgID
创建实例。protected const string WMP_PROG_ID = "WMPlayer.OCX.7";
private dynamic _wmp;
protected virtual bool init(){
try{
_wmp = Activator.CreateInstance(Type.GetTypeFromProgID(WMP_PROG_ID));
}
catch{ return false; }
return true;
}
我曾试图通过Reflection
来实现这一点,但我发现dynamic
更适合我的情况。
每个属性和方法都正常工作,比如:
protected override bool setSpeed(float speed){
try{
_wmp.settings.rate = speed;
}
catch { return false; }
return true;
}
protected override int getLength(){
double res;
try{
res = _wmp.currentMedia.duration;
}
catch { return 0; }
return (int)(res * 1000);
}
很不幸,当我想像我在顶部指出的文章那样附加事件时,它没有起作用。
我的代码如下:
protected bool connectEvent(){
_wmp.StatusChange += new EventHandler(_wmp_StatusChange);
return true;
}
protected void _wmp_StatusChange(object sender, EventArgs e){
Console.WriteLine(_wmp.Status);
}
我检查了
StatusChange
事件处理程序的类型,它是EventHandler
。这些代码编译得很好,我可以加载一些音乐,播放,暂停,...做任何我想做的事情。
但是
StatusChange
事件从未触发过。我尝试在
connectEvent
设置断点。当运行
_wmp.StatusChange += new EventHandler(...)
时,IntelliTrace向我提供了一些信息。这些信息已经用繁体中文写出来了,我认为它的意思是:
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException
:无法将操作符"+="应用于类型System.Dynamic.DynamicObject
和System.EventHandler
即使有异常,但就像我说的,编译通过了,一切仍然有效-除了我无法监听事件。那么,如何在动态对象
_wmp
中成功附加事件?对我来说,任何可能的解决方案(如
Reflection
)都是有用的。另外,在上面的情况下,
StatusChange
处理程序的类型是EventHandler
。但是,如果我想处理
PlayStateChange
事件,则如果我不添加对wmp.dll的引用,则会出现“未知句柄”。我希望解决方案也适用于此情况。
提前感谢大家的支持,并请原谅我拙劣的英语。
Status
是String.Empty
。当我通过_wmp.URL = "some media"
加载媒体后,它会变成 _Connecting_。当媒体开始播放时,状态将更改为 _Playing some media in mm:ss_。 - J.C