2012-04-02 49 views
0

我正在爲IE瀏覽器的C#BHO插件工作。插件應該對滾動事件作出反應。代碼波紋管負責:C#BHO的Onscroll事件處理IE9

var document = (HTMLDocument)webBrowser.Document; 
((HTMLWindowEvents2_Event)document.parentWindow).onscroll += WebBrowserWindowOnScroll; 

這種方法在IE7和IE8中工作得很好。但在IE9中完全沒用。 我發現了這個解決方法: http://social.msdn.microsoft.com/Forums/et-EE/ieextensiondevelopment/thread/808df95a-c559-44c3-93b7-b9e3b2c3b737

它似乎應該解決問題,但不幸的是它在C++上,我沒能在C#上移動它。 有人可以建議IE9的解決方法或如何實現上述C#上的方法嗎?

非常感謝!

回答

0

我設法找到解決方案。

IHTMLWindow3有一個方法的attachEvent這需要事件作爲第一個參數(在我的案例「onscroll」)和物體將負責事件處理的名稱。最棘手的部分是與這個處理程序對象連接。它應該實現IDispatch接口,但IE9使用此接口的方式非常奇怪。它調用IDispatch.Invoke而不指定應該調用的方法名稱。當類標記爲[ClassInterface(ClassInterfaceType.AutoDispatch)]屬性時,.NET自動實現IDispatch,並使用反射根據參數IDispatch.Invoke調用其實例方法。在我們的例子中,方法名稱是空的,所以什麼都不會被調用[DispId(0)]屬性允許解決此問題,它指定如果Invoke收到空方法名稱應該調用什麼方法。

[ComVisible(true)] 
[ClassInterface(ClassInterfaceType.AutoDispatch)] 
public class EventListener 
{ 
    [DispId(0)] 
    public void HandleEvent(object target) 
    { 

    } 
} 

應該提及的是,處理程序方法的名稱並不重要。但其簽名很重要。 F.E. 'onscroll'事件應該如上所示,'onclick'處理程序不需要參數等。