现在正在学习写BHO控件,希望实现当右键点击时,能对右键菜单的基础上动态的增加一些自己的功能在IE中点击时,有多种情况,
一种是默认点击,在IE的非编辑区,非文字选中区以及非FLASH等控件处,点击右键,所弹出的菜单
另一种是在编辑区以及选中文字区进行右键点击,
还有一种情况是对对象,比如链接,图片等进行右键点击时,出现的菜单。如何在这多种情况所出现的菜单中,动态的增加自己的功能菜单项呢?我在网上发现,QQ等一些软件,是通过注册表注册的方式的方式将自己的菜单项注册到右键菜单中的而360安全浏览器中点击右键时,也会出现一些只有在360浏览器中才能使用的功能,比如对链接点击时,出现“使用360安全浏览器下载”的选项想知道,这样的菜单项是怎么实现的。
另外360浏览器在点击右键时,右键菜单的样式也发生了变化,这是怎么做到的?能解决此问题的,另外开贴有分相送
一种是默认点击,在IE的非编辑区,非文字选中区以及非FLASH等控件处,点击右键,所弹出的菜单
另一种是在编辑区以及选中文字区进行右键点击,
还有一种情况是对对象,比如链接,图片等进行右键点击时,出现的菜单。如何在这多种情况所出现的菜单中,动态的增加自己的功能菜单项呢?我在网上发现,QQ等一些软件,是通过注册表注册的方式的方式将自己的菜单项注册到右键菜单中的而360安全浏览器中点击右键时,也会出现一些只有在360浏览器中才能使用的功能,比如对链接点击时,出现“使用360安全浏览器下载”的选项想知道,这样的菜单项是怎么实现的。
另外360浏览器在点击右键时,右键菜单的样式也发生了变化,这是怎么做到的?能解决此问题的,另外开贴有分相送
好主意,同样在关注google tester社区。用注册表是好方法。
360应该是这样做的,你在其页面上会向其后台发送请求,然后在你的注册表里面临时注册的项。
贴出来看看吧
HRESULT CBrowserHost::ShowContextMenu(DWORD dwID, POINT *ppt,IUnknown *pcmdTarget,IDispatch *pdispObject)
{
#define IDR_BROWSE_CONTEXT_MENU 24641
#define IDR_FORM_CONTEXT_MENU 24640
#define SHDVID_GETMIMECSETMENU 27
#define SHDVID_ADDMENUEXTENSIONS 53 HRESULT hr;
HINSTANCE hinstSHDOCLC;
HWND hwnd;
HMENU hMenu; CComPtr spCT;
CComPtr spWnd; MENUITEMINFO mii = {0};
CComVariant var, var1, var2;
hr = pcmdTarget->QueryInterface(IID_IOleCommandTarget, (void**)&spCT);
hr = pcmdTarget->QueryInterface(IID_IOleWindow, (void**)&spWnd);
hr = spWnd->GetWindow(&hwnd);//取得浏览器窗口句柄
hinstSHDOCLC = LoadLibrary(TEXT("SHDOCLC.DLL"));
if (hinstSHDOCLC == NULL)
{
// Error loading module -- fail as securely as possible
return;
}
hMenu = LoadMenu(hinstSHDOCLC, MAKEINTRESOURCE(IDR_BROWSE_CONTEXT_MENU));
hMenu = GetSubMenu(hMenu, dwID);
// Get the language submenu
hr = spCT->Exec(&CGID_ShellDocView, SHDVID_GETMIMECSETMENU, 0, NULL, &var);
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_SUBMENU;
mii.hSubMenu = (HMENU) var.byref;
// Add language submenu to Encoding context item
SetMenuItemInfo(hMenu, IDM_LANGUAGE, FALSE, &mii);
// Insert Shortcut Menu Extensions from registry
V_VT(&var1) = VT_INT_PTR;
V_BYREF(&var1) = hMenu;
V_VT(&var2) = VT_I4;
V_I4(&var2) = dwID;
hr = spCT->Exec(&CGID_ShellDocView, SHDVID_ADDMENUEXTENSIONS, 0, &var1, &var2);
// Remove View Source
DeleteMenu(hMenu, IDM_VIEWSOURCE, MF_BYCOMMAND);//删除“查看源文件”菜单项
// Show shortcut menu
int iSelection = ::TrackPopupMenu(hMenu,
TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD,//返回用户选择的菜单命令ID
ppt->x,
ppt->y,
0,
hwnd,
(RECT*)NULL);
// Send selected shortcut menu item command to shell
LRESULT lr = ::SendMessage(hwnd, WM_COMMAND, iSelection, NULL);//发送到Internet Explorer_Server进行内部处理。
FreeLibrary(hinstSHDOCLC);
return S_OK;
}