我認爲this article與我有同樣的問題。但是,我的情況沒有可行的解決方案。如何將事件附加到動態對象或COM對象
我在我的程序中使用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);
}
不幸的是,當我要附上事件像the article I indicated in the top,它有沒有工作。
我這樣的代碼:
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給我一些信息。
這些信息是用Trad寫的。中國人,我認爲這意味着:
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException
:無法應用運算符「+ =」輸入System.Dynamic.DynamicObject
和System.EventHandler
即使有一個例外,但就像我說的,編譯通過後,一切仍然工作 - - 除了我不聽事件。
那麼,如何在動態對象_wmp
中成功附加事件?
任何可能的解決方案(如Reflection
)對我很有用。
此外,在上述情況下,處理器類型StatusChange
是EventHandler
。
但是,如果我想處理PlayStateChange
事件,如果我不添加wmp.dll的引用,它是一個「未知的句柄」。
我希望解決方案也適用於這種情況。
非常感謝大家的支持,請原諒我的英文不好。
您如何確保WMPlayer狀態發生變化? – 2013-03-26 06:28:55
@SrikanthVenugopalan:accroding [MSDN](http://msdn.microsoft.com/en-us/library/windows/desktop/dd564082.aspx),當我的_wmp.Status改變時引發這個事件。我檢查了狀態字符串,並且它發生了變化,所以我認爲事件也應該提高。 – 2013-03-26 06:41:25
同意 - 想知道您是否知道狀態屬性被更改,並且由於它是隻讀屬性,您將如何更改狀態? – 2013-03-26 06:43:01