【问题标题】:How to show my own context menu in Internet Explorer如何在 Internet Explorer 中显示我自己的上下文菜单
【发布时间】:2014-05-09 03:02:56
【问题描述】:

我正在为 Internet Explorer 9 编写插件,我必须将默认上下文菜单更改为我自己的。我正在用 C++ 编写 BHO,并且正在使用 ATL。我设法处理了显示上下文菜单 (HTMLDocumentEvents2::oncontextmenu) 的事件,但我无法显示我自己的。这是您单击鼠标右键时触发的代码:

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。

你知道我做错了什么吗?我需要带有一些文本项的简单菜单。

【问题讨论】:

    标签: c++ winapi internet-explorer contextmenu bho


    【解决方案1】:

    我想通了。 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-20
      • 1970-01-01
      相关资源
      最近更新 更多