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   に答える