2012-04-02 12 views
0

Ich arbeite an C# BHO Plug-in für IE. Das Plug-in sollte auf das Scroll-Ereignis reagieren. Code gebrüll verantwortlich dafür:Onscroll Ereignisbehandlung in C# BHO für IE9

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

Dieser Ansatz funktioniert ziemlich gut in IE7 und IE8. Aber völlig nutzlos in IE9. habe ich diese Abhilfe gefunden: http://social.msdn.microsoft.com/Forums/et-EE/ieextensiondevelopment/thread/808df95a-c559-44c3-93b7-b9e3b2c3b737

Es scheint, dass es es Problem, aber leider auf C lösen sollte ++ und ich nicht auf C# zu bewegen. Kann jemand eine Problemumgehung für IE9 vorschlagen oder wie wird der oben in C# beschriebene Ansatz implementiert?

Thanks so much!

Antwort

0

Ich habe es geschafft, die Lösung zu finden.

IHTMLWindow3 hat eine Methode attachEvent die Namen der Veranstaltung als erstes Argument („onscroll“ in meinem Fall) und Objekt erfordert, die für die Ereignisverarbeitung verantwortlich ist. Der schwierigste Teil ist mit diesem Handler-Objekt verbunden. Es sollte IDispatch Schnittstelle implementieren, aber IE9 verwenden diese Schnittstelle in einer ziemlich bizarren Art und Weise. Es ruft IDispatch.Invoke ohne Angabe eines Methodennamens, der aufgerufen werden sollte. .NET implementiert automatisch IDispatch, wenn Klasse durch [ClassInterface (ClassInterfaceType.AutoDispatch)] Attribut markiert ist, und verwendet Reflektion, um seine Instanzmethoden nach Argumenten von IDispatch.Invoke aufzurufen. In unserem Fall ist der Methodenname leer, so dass nichts aufgerufen wird. [DispId (0)] Attribut ermöglicht es, dieses Problem zu lösen, gibt es Methode, was aufgerufen werden sollte, wenn Invoke erhält leere Methodenname.

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

    } 
} 

Es sollte erwähnt werden, dass der Name der Handler-Methode keine Rolle spielt. Aber seine Unterschrift ist wichtig. f. für 'onscroll' Ereignis sollte es wie oben gezeigt sein, 'onclick' Handler benötigt keine Argumente etc.