2012-04-02 50 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'处理程序不需要参数等。