2011-03-30 2 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

나는 그것을 꺼 냈다. 이고르 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; 
} 
관련 문제