[英]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.