针对IE9的C#BHO中的Occroll事件处理

时间:2012-04-02 06:32:30

标签: c# internet-explorer events bho

我正在研究用于IE的C#BHO插件。插件应该对滚动事件做出反应。代码对此负责:

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#上实现上述方法吗?

非常感谢!

1 个答案:

答案 0 :(得分:0)

我设法找到了解决方案。

IHTMLWindow3 有一个方法 attachEvent ,它需要将事件的名称作为第一个参数(在我的情况下为“onscroll”)和将负责事件处理的对象。最棘手的部分是与此处理程序对象连接。它应该实现 IDispatch 接口,但是IE9以一种非常奇怪的方式使用这个接口。它调用 IDispatch.Invoke 而不指定应该调用的方法名称。当类标记为 [ClassInterface(ClassInterfaceType.AutoDispatch)] 属性时,.NET会自动实现 IDispatch ,并使用反射根据 IDispatch的参数调用其实例方法。调用即可。在我们的例子中,方法名称为空,因此不会调用任何内容。 [DispId(0)] 属性允许解决此问题,它指定在Invoke接收空方法名称时应该调用的方法。

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

    }
}

应该提到处理程序方法的名称无关紧要。但它的签名很重要。 F.E.对于'onscroll'事件,它应该如上所示,'onclick'处理程序不需要参数等。