DWebBrowserEvents2がATLのマクロを使用して処理されたときHTMLElementEvents2ハンドル

StackOverflow https://stackoverflow.com/questions/1106659

質問

私はVS2008、C ++を使用して、ブラウザヘルパーオブジェクトを作成しています。私のクラスは多くの人の間ではIDispEventImplから派生されています。

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()
.
.
.
}

上記のコードから明らかなように、私のDWebBrowserEvents2は、ATLのマクロを使用して処理されます。今、私はHTMLElementEvents2を処理することについては(クリック、スクロールバーなどを検出するため)、I IConnectionPointContainerのQueryInterface()IHTMLElement、のQueryInterface(のためのIHTMLDocument2オブジェクト)それとはIConnectionPointContainer :: FindConnectionPoint(DIID_HTMLElementEvents2)を呼び出します。 (HTMLElementEvents2の取り扱いに関する MSDNの記事を参照してください)。問題は、私は私のクラスでのIDispatch ::呼び出しを上書きしたときに、(ATLマクロを使用して作成)DWebBrowserEvents2ハンドルが失敗し、です。それだけでHTMLElementEvents2?
扱うように呼び出す呼び出しを上書きせずにHTMLElementEvents2を扱う、または実装する方法はあります おかげで、すべてのヘルプは大歓迎されます。

役に立ちましたか?

解決

起動をオーバーライドしたり、IConnectionPointContainerを取得するための本当の必要はありません。

:これは、別のはIDispEventImplを実装する、ATLプロジェクトですので、
public IDispEventImpl<2, CHelloWorldBHO, &DIID_HTMLTextContainerEvents2, &LIBID_MSHTML, 4, 0>

トリックを行います。次に、エントリをシンクとしてます:

SINK_ENTRY_EX(2, DIID_HTMLTextContainerEvents2, DISPID_ONSCROLL, OnScroll)

OnDocumentCompleteで、のIWebBrowser2 :: get_Document、IHTMLDocument2 :: get_bodyを呼び出し、その後、イベントの受信を開始するDispEventAdviseを呼び出します。

私はDIID_HTMLTextContainerEvents2代わりのDIID_HTMLElementEventsを使用しましたことに注意してください。これは、ボディオブジェクトがHTMLElementEvents2をサポートしていないためだ、と私の目的のために(スクロール処理するために)これはうまく動作します!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top