2011-03-30 70 views
2

我正在爲Internet Explorer 9編寫附加組件,並且必須將默認上下文菜單更改爲我自己的。我在C++中編寫BHO,並使用ATL。我設法處理了顯示上下文菜單(HTMLDocumentEvents2::oncontextmenu)的事件,但我無法顯示我自己的一個。下面是當你點擊鼠標右鍵發射代碼:如何在Internet Explorer中顯示我自己的上下文菜單

VARIANT_BOOL STDMETHODCALLTYPE CSpellCheckerBHO::OnContextMenu(IHTMLEventObj *pEvtObj) 
{ 
    HMENU contextMenu = CreatePopupMenu(); 

    MENUITEMINFO item_info = { 0 }; 
    item_info.cbSize = sizeof(MENUITEMINFO); 
    item_info.fMask = MIIM_TYPE | MIIM_ID; 
    item_info.fType = MFT_STRING; 
    item_info.wID = 0; 
    item_info.dwTypeData = L"TEST"; 
    item_info.cch = 4; 

    BOOL result = InsertMenuItem(contextMenu, 0, FALSE, &item_info); 
    HWND browserHandle = 0; 
    HRESULT hr = _webBrowser->get_HWND((LONG_PTR*)&browserHandle); 

    result = TrackPopupMenuEx(contextMenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, 0,0, browserHandle , NULL); 

    return VARIANT_FALSE; 
} 

_webBrowser是指向IWebBrowser2的對象,我從SetSite功能得到了它。

的標準上下文菜單不顯示(由於返回VARIANT_FALSE),但TrackPopupMenuEx不執行任何操作,並返回0。

你知道我在做什麼錯?我需要簡單的菜單和一些文本項目。

回答

4

我把它拼出來了。 Igor Tandetnik幫我解決了IE addon forum。 HWND來自不同的進程,並且TrackPopupMenuEx期望屬於調用線程的HWND。以下是可用的代碼:

VARIANT_BOOL STDMETHODCALLTYPE CSpellCheckerBHO::OnContextMenu(IHTMLEventObj *pEvtObj) 
{ 
    HMENU contextMenu = CreatePopupMenu(); 

    MENUITEMINFO item_info = { 0 }; 
    item_info.cbSize = sizeof(MENUITEMINFO); 
    item_info.fMask = MIIM_ID | MIIM_STRING; 
    item_info.wID = 0; 
    item_info.dwTypeData = L"TEST"; 
    item_info.cch = 4; 

    BOOL result = InsertMenuItem(contextMenu, 0, TRUE, &item_info); 

    CComPtr<IDispatch> dispDoc; 
    _webBrowser->get_Document(&dispDoc); 
    CComQIPtr<IOleWindow> oleWindow = dispDoc; 
    HWND browserHandle; 
    oleWindow->GetWindow(&browserHandle); 


    CComQIPtr<IHTMLEventObj2> htmlEventObj = pEvtObj; 
    long x, y; 
    htmlEventObj->get_screenX(&x); 
    htmlEventObj->get_screenY(&y); 

    result = TrackPopupMenuEx(contextMenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, x, y, browserHandle , NULL); 

    return VARIANT_FALSE; 
}