2009-07-01 7 views
1

IEでスクロールバーのイベントに反応する必要があるIE拡張(VS2008、C++を使用)を作成します。私はそのためにBHOを使用しており、IWebBrowser2要素、IHTMLDocument2要素、および親ウィンドウのHWNDにアクセスできます。私はスクロールバーにアクセスする方法を理解できません。スクロールバーオブジェクトを取得する方法(またはIEウィンドウの子ウィンドウですか?)ではなく、スクロールバーにアクセスできるようにするコードを見ました。何か案は?IEの拡張機能からWebページのスクロールを検出します。

答えて

0

答えはthisスレッドを参照してください。私の問題と正しい答えはここで正しく説明されています。

1

MSHTMLは、ネイティブのシステムコントロールを使用する代わりに、独自のスクロールバーを表示します。そのため、CSSルールを適用することができます。

私は何をしようとすると、次のとおりです。

  1. のQueryInterface()IHTMLElementためIHTMLDocument2 オブジェクト。
  2. QueryInterface()for IConnectionPointContainer。
  3. 次に、 IConnectionPointContainer :: FindConnectionPoint(DIID_HTMLElementEvents2)を呼び出します。
  4. IDispatch :: Invoke()と を実装すると、誰かが ドキュメントをスクロールするとOnScroll イベントが発生します。
  5. リンスしてサブフレームを繰り返す。
+0

お返事ありがとうございます。私はATLを使用しているので、私は自分のクラスにIDispEventImplの別の実装を持つことができたことに気付きました。しかし、ありがとう! – GotAmye

0

私はIDispatchImplが既に実装されているので、イベントを処理するためにIDispatch :: InvokeメソッドのATL実装をオーバーライドする必要があると思います。それが正しいか? その場合、DIID_DWebBrowserEvents2のシンクエントリがありますが、どのように影響を受けますか? はここに私のクラスには、次のようになります方法は次のとおりです。

class ATL_NO_VTABLE CHelloWorldBHO : 
    public CComObjectRootEx<CComSingleThreadModel>, 
    public CComCoClass<CHelloWorldBHO, &CLSID_HelloWorldBHO>, 
    public IObjectWithSiteImpl<CHelloWorldBHO>, 
    public IDispatchImpl<IHelloWorldBHO, &IID_IHelloWorldBHO, &LIBID_HelloWorldLib, /*wMajor =*/ 1, /*wMinor =*/ 0>, 
    public IDispEventImpl<1, CHelloWorldBHO, &DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 1> 
{ 
. 
. 
. 
BEGIN_SINK_MAP(CHelloWorldBHO) 
    SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, OnDocumentComplete) 
    SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_BEFORENAVIGATE2, BeforeNavigate2)//Handle BeforeNavigate2 
END_SINK_MAP() 
. 
. 
. 
} 

おかげ

編集:私は起動が上書きされたときに、OnDOcumentCOmpleteが呼び出されないことを発見しました。これをどうやって回避するのですか?

関連する問題