1

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

4

2 に答える 2

1

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

私が試してみるのは:

  1. QueryInterface()IHTMLElementのIHTMLDocument2オブジェクト。
  2. IConnectionPointContainer用のQueryInterface()。
  3. 次に、IConnectionPointContainer :: FindConnectionPoint(DIID_HTMLElementEvents2)を呼び出します。
  4. IDispatch :: Invoke()を実装すると、誰かがドキュメントをスクロールしたときにOnScroll イベントが発生するはずです。
  5. すすぎ、サブフレームに対して繰り返します。
于 2009-07-01T22:33:51.583 に答える
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()
.
.
.
}

ありがとう

編集: Invoke が上書きされると、OnDOcumentCOMplete が呼び出されないことがわかりました。どうすればこれを回避できますか?

于 2009-07-08T20:35:42.820 に答える