IEのスクロールバーイベントに反応する必要があるIE拡張機能(VS2008、C ++を使用)を作成しています。そのためにBHOを使用しており、親ウィンドウのIWebBrowser2要素、IHTMLDocument2要素、およびHWNDにアクセスできます。スクロールバーにアクセスする方法がわかりません。スクロールバーにアクセスできるようになるとスクロールバーを処理できるコードを見たことがありますが、スクロールバーオブジェクト(またはIEウィンドウの子ウィンドウですか?)自体を取得する方法はわかりません。何か案は?
2 に答える
1
MSHTMLは、ネイティブのシステムコントロールを使用する代わりに、独自のスクロールバーをレンダリングします。そのため、CSSルールを適用できます。
私が試してみるのは:
- QueryInterface()IHTMLElementのIHTMLDocument2オブジェクト。
- IConnectionPointContainer用のQueryInterface()。
- 次に、IConnectionPointContainer :: FindConnectionPoint(DIID_HTMLElementEvents2)を呼び出します。
- IDispatch :: Invoke()を実装すると、誰かがドキュメントをスクロールしたときにOnScroll イベントが発生するはずです。
- すすぎ、サブフレームに対して繰り返します。
于 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 に答える