2010-03-09 109 views
0

我想讓我的BHO收聽某個網頁中某些元素的onmousedown事件。 我有所有的代碼,找到特定的元素,並在msdn它說我需要使用get_onmousedown事件。我想出了這個代碼。鼠標事件BHO

CComQIPtr<IHTMLElement> someElement; 
VARIANT mouse_eve; 
someElement->get_onmousedown(&mouse_eve); 

問題是,如何告訴它在發生此事件時運行某些函數?

回答

3

v - 型VT_DISPATCH指定與當事件發生時調用的默認方法的對象的IDispatch接口的VARIANT。在這種情況下

事件處理程序是實現IDispatch COM實例 - 所以你需要一個指針傳遞給IDispatch,你的事件處理程序對象實現:

CComQIPtr<IDispatch> spDisp(spMyHandler); // something like that 
someElement->put_onmousedown(CComVariant(spDisp)); 

注:put_,而不是get_ - 你想註冊一個處理程序

在此,IDispatch::Invoke()被調用以:

  • wFlags含有DISPATCH_METHOD「的方法是越來越被調用」
  • dispIdMember0/DISPID_VALUE「默認方法」

放在一起這應該beco我是這樣的:

HRESULT MyHandler::Invoke(DISPID dispIdMember, REFIID, LCID, WORD wFlags, 
          DISPPARAMS*, VARIANT*, EXCEPINFO*, UINT*) 
{ 
    // ... 

    if((wFlags & DISPATCH_METHOD) && (dispIdMember == DISPID_VALUE)) 
    { 
     // ... 
    } 
} 
+0

它不會讓我 「MainClassName ::調用」 添加爲一個功能:「重寫虛函數從「ATL ::的IDispatchImpl不同 ::僅通過調用約定調用「 – shaimagz 2010-03-09 01:52:52

+0

使用'HRESULT STDMETHODCALLTYPE爲該聲明調用(/ * params * /)'或'STDMETHOD(調用)(/ * params * /)'。 – 2010-03-09 02:21:51

+0

謝謝!最後一個問題:在invoke方法中,我如何使用當前的IDispatch? – shaimagz 2010-03-09 03:23:06