IE9的C#BHO Onscroll事件处理

IE9的C#BHO Onscroll事件处理,c#,internet-explorer,events,bho,C#,Internet Explorer,Events,Bho,我正在为IE开发C#BHO插件。该插件应该对滚动事件做出反应。下面的代码负责: var document = (HTMLDocument)webBrowser.Document; ((HTMLWindowEvents2_Event)document.parentWindow).onscroll += WebBrowserWindowOnScroll; 这种方法在IE7和IE8中非常有效。但在IE9中完全无用。 我发现了以下解决方法: 似乎它应该解决问题,但不幸的是它在C++上和我没有在C上移

我正在为IE开发C#BHO插件。该插件应该对滚动事件做出反应。下面的代码负责:

var document = (HTMLDocument)webBrowser.Document;
((HTMLWindowEvents2_Event)document.parentWindow).onscroll += WebBrowserWindowOnScroll;
这种方法在IE7和IE8中非常有效。但在IE9中完全无用。 我发现了以下解决方法:

似乎它应该解决问题,但不幸的是它在C++上和我没有在C上移动它。 有人能建议IE9的解决方法,或者如何在C#上实现上述方法吗


非常感谢

我设法找到了解决办法

IHTMLWindow3有一个方法attachEvent,该方法要求将事件名称作为第一个参数(“在我的例子中是onscroll”)和负责事件处理的对象。最棘手的部分是与这个处理程序对象连接的。它应该实现IDispatch接口,但是IE9以一种非常奇怪的方式使用这个接口。它调用IDispatch.Invoke,但不指定应调用的方法名。NET在类标记为[ClassInterface(ClassInterfaceType.AutoDispatch)]属性时自动实现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”处理程序不需要参数等