如何使用 IDocHostUIHandler::ShowContextMenu 修改 Internet Explorer 的上下文菜单?
我正在尝试为 Internet Explorer 7.0 实现自定义菜单。为此,我必须仅使用 IDocHostUIHandler::ShowContextMenu
。到目前为止,我已经能够实现带有两个选项的基本上下文菜单。问题是它们默认被禁用。相同的示例代码是:
HRESULT CWebEventHandler::ShowContextMenu(DWORD dwID,POINT *ppt, IUnknown *pcmdTarget, IDispatch *pdispObject)
{
if (false) // I will put some guard code here. as of now do not consider it
return S_FALSE; // Show standard context menus.
else
{
IOleWindow* pWnd = NULL;
HRESULT hr = pcmdTarget->QueryInterface(IID_IOleWindow,
(void**) &pWnd);
if (SUCCEEDED(hr))
{
HWND hwnd;
if (SUCCEEDED(pWnd->GetWindow(&hwnd)))
{
HMENU menu = ::CreatePopupMenu();
::AppendMenu(menu, MF_STRING, ID_HELLO, L"&Hello" ); // ID_HELLO & ID_WORLD are two menu resource items
::AppendMenu(menu, MF_STRING, ID_WORLD, L"&World" );
long myRetVal = ::TrackPopupMenu(menu,
TPM_RIGHTBUTTON | TPM_LEFTALIGN | TPM_RETURNCMD,
ppt->x, ppt->y, NULL, hwnd, NULL);
// Send the command to the browser.
//
LRESULT myResult = ::SendMessage(hwnd, WM_COMMAND,
myRetVal, NULL);
}
pWnd->Release();
}
}
return S_OK;
}
请建议此代码有什么问题&为什么我的菜单项被禁用?
谢谢
编辑
此链接上也提供了同一篇文章(http://social.msdn.microsoft.com/Forums/en/ieextensiondevelopment/thread/13584f76-21bd-4764-b5b7-e81932561574 )
I am trying to implement a custom menu for Internet Explorer 7.0. For this i have to use IDocHostUIHandler::ShowContextMenu
only. Till now i am able to implement a basic context menu with two options. The problem is that they are disabled by default. The sample code for the same is:
HRESULT CWebEventHandler::ShowContextMenu(DWORD dwID,POINT *ppt, IUnknown *pcmdTarget, IDispatch *pdispObject)
{
if (false) // I will put some guard code here. as of now do not consider it
return S_FALSE; // Show standard context menus.
else
{
IOleWindow* pWnd = NULL;
HRESULT hr = pcmdTarget->QueryInterface(IID_IOleWindow,
(void**) &pWnd);
if (SUCCEEDED(hr))
{
HWND hwnd;
if (SUCCEEDED(pWnd->GetWindow(&hwnd)))
{
HMENU menu = ::CreatePopupMenu();
::AppendMenu(menu, MF_STRING, ID_HELLO, L"&Hello" ); // ID_HELLO & ID_WORLD are two menu resource items
::AppendMenu(menu, MF_STRING, ID_WORLD, L"&World" );
long myRetVal = ::TrackPopupMenu(menu,
TPM_RIGHTBUTTON | TPM_LEFTALIGN | TPM_RETURNCMD,
ppt->x, ppt->y, NULL, hwnd, NULL);
// Send the command to the browser.
//
LRESULT myResult = ::SendMessage(hwnd, WM_COMMAND,
myRetVal, NULL);
}
pWnd->Release();
}
}
return S_OK;
}
Kindly suggest what is wrong with this code & why my menu entries are disabled??
Thanks
EDIT
The same post is available on this link also ( http://social.msdn.microsoft.com/Forums/en/ieextensiondevelopment/thread/13584f76-21bd-4764-b5b7-e81932561574 )
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我想我已经解决了问题。在
if (SUCCEEDED(pWnd->GetWindow(&hwnd)))
中获取 hwnd 对象后,为上下文菜单安装您自己的 CALLBACK。 否则在回调中让原始处理程序处理它。
完成后
恢复到原始过程处理程序......
示例
I think i have solved the problem. After getting the hwnd object in
if (SUCCEEDED(pWnd->GetWindow(&hwnd)))
install your own CALLBACK for context menu. In the callbackotherwise let the original handler process it.
once done with
revert back to the original proc handler....
Sample
我确信您已经弄清楚了这一点,但在第二个示例中,您正在做:
::SendMessage(hwnd, WM_COMMAND,myRetVal, NULL);
恢复后:
SetWindowLong(hwnd, GWL_WNDPROC, (LONG)g_lpPrevWndProc);
你的回调永远不会在返回 0 时执行;不过,在这个特定样本中也不存在这种情况。
I'm sure you already figured this out, but in the second sample, you are doing:
::SendMessage(hwnd, WM_COMMAND,myRetVal, NULL);
after reverting:
SetWindowLong(hwnd, GWL_WNDPROC, (LONG)g_lpPrevWndProc);
Your callback will never get executed on the return 0; path, though, nor was there such a case in this particular sample.