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

标签 c++ winapi internet-explorer contextmenu bho

我正在为 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。

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

最佳答案

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

关于c++ - 如何在 Internet Explorer 中显示我自己的上下文菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5485774/

相关文章:

c++ - 如何在 QT 中开发美观、视觉现代的应用程序?

c++ - 像 GTA IV 这样的游戏如何不碎片化堆?

c++ - 编写一个在启动时注册 COM 并在终止时注销的可执行文件 (Win32)

html - 额外的隐藏表单输入,导致表格单元格在 IE7 上展开(截图)

angularjs - Angular $q .catch() 方法在 IE8 中失败

c++ - 仅将纪元字符串保存到 mysql 日期时间年/月/日但没有小时分钟秒

c++ - 如果类的成员是引用,为什么复制对象是非法的?

css - 当我尝试在 IE 中查看我的 jqgrid 时,它在标题和表格之间出现空白,如何解决这个问题?

c++ - 枚举已安装产品的升级代码?

c++ - 我如何处理更改插入符位置的事件?