2012-04-02 3 views
0

IEのC#BHOプラグインで作業しています。スクロールイベントに反応するプラグイン。それに責任を負うコードのIE9用のC#BHOでのOnscrollイベント処理

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は、イベント処理を担当する第一引数(私の場合は「onscroll」)およびオブジェクトとしてイベントの名前を必要とする方法attachEventを持っています。もっともトリッキーな部分は、このハンドラオブジェクトに関連付けられています。それはIDispatchインターフェイスを実装する必要がありますが、IE9はこのインターフェイスを非常に奇妙な方法で使用します。呼び出すメソッド名を指定せずにIDispatch.Invokeを呼び出します。 .NETは自動的でマークのIDispatch場合クラス[ClassInterface(ClassInterfaceType.AutoDispatch)]属性を実装し、IDispatch.Invokeの引数に応じて、そのインスタンスのメソッドを呼び出すためにリフレクションを使用します。私たちの場合、メソッド名は空で、何も呼び出されません。 [DispId(0)]属性でこの問題を解決できますが、Invokeが空のメソッド名を受け取った場合に呼び出されるメソッドを指定します。

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

    } 
} 

ハンドラメソッドの名前は関係ありません。しかし、その署名は重要です。 f.e. 'onscroll'イベントの場合は上記のようにする必要があります。 'onclick'ハンドラは引数などを必要としません。