简体   繁体   中英

Onscroll event handling in C# BHO for IE9

I'm working on C# BHO plug-in for IE. Plug-in supposed to react on scroll event. Code bellow responsible for it:

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

This approach works pretty good in IE7 and IE8. But completely useless in IE9. I have found this workaround: http://social.msdn.microsoft.com/Forums/et-EE/ieextensiondevelopment/thread/808df95a-c559-44c3-93b7-b9e3b2c3b737

It seems that it should solve problem but unfortunately it on C++ and I failed to move it on C#. Can someone suggest workaround for IE9 or how to implement approach mentioned above on C#?

Thanks so much!

I managed to find the solution.

IHTMLWindow3 has a method attachEvent which requires name of the event as a first argument (“onscroll” in my case) and object which will be responsible for event handling. The trickiest part is connected with this handler object. It should implement IDispatch interface, but IE9 use this interface in a pretty bizarre way. It calls IDispatch.Invoke without specifying a method name which should be called. .NET automatically implements IDispatch when class marked by [ClassInterface(ClassInterfaceType.AutoDispatch)] attribute, and uses reflection to call its instance methods according to arguments of IDispatch.Invoke . In our case method name is empty so nothing will be called. [DispId(0)] attribute allows to solve this problem, it specifies method what should be called if Invoke receives empty method name.

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

    }
}

It should be mentioned that name of handler method doesn't matter. But its signature is important. fe for 'onscroll' event it should be like shown above, 'onclick' handler requires no arguments etc.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM