简体   繁体   English

如何在Internet Explorer中显示我自己的上下文菜单

[英]How to show my own context menu in Internet Explorer

I'm writing add-on for Internet Explorer 9 and I have to change default context menu to my own. 我正在为Internet Explorer 9编写加载项,并且必须将默认上下文菜单更改为自己的菜单。 I'm writing a BHO in C++ and I'm using ATL. 我正在用C ++编写BHO,并且正在使用ATL。 I managed to handle event of showing context menu ( HTMLDocumentEvents2::oncontextmenu ), but I can't display my own one. 我设法处理了显示上下文菜单的事件( HTMLDocumentEvents2 :: oncontextmenu ),但是我无法显示自己的菜单。 Here is the code fired when you click right mouse button: 这是单击鼠标右键时触发的代码:

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 is a pointer to IWebBrowser2 object, I got it from SetSite function. _webBrowser是指向IWebBrowser2对象的指针,我是从SetSite函数获得的。

The standard context menu is not displayed (due to returning VARIANT_FALSE), but TrackPopupMenuEx does nothing and returns 0. 不显示标准上下文菜单(由于返回VARIANT_FALSE),但是TrackPopupMenuEx不执行任何操作并返回0。

Do you know what I am doing wrong? 你知道我在做什么错吗? I need simple menu with some text items. 我需要带有一些文本项的简单菜单。

I fgured it out. 我搞砸了 Igor Tandetnik helped me on IE addon forum . Igor Tandetnik在IE插件论坛上帮助了我。 HWND was from different proccess and TrackPopupMenuEx expects HWND belonging to the calling thread. HWND来自不同的过程, TrackPopupMenuEx期望HWND属于调用线程。 Here's the code that works: 这是有效的代码:

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;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM