现在正在学习写BHO控件,希望实现当右键点击时,能对右键菜单的基础上动态的增加一些自己的功能在IE中点击时,有多种情况,
一种是默认点击,在IE的非编辑区,非文字选中区以及非FLASH等控件处,点击右键,所弹出的菜单
另一种是在编辑区以及选中文字区进行右键点击,
还有一种情况是对对象,比如链接,图片等进行右键点击时,出现的菜单。如何在这多种情况所出现的菜单中,动态的增加自己的功能菜单项呢?我在网上发现,QQ等一些软件,是通过注册表注册的方式的方式将自己的菜单项注册到右键菜单中的而360安全浏览器中点击右键时,也会出现一些只有在360浏览器中才能使用的功能,比如对链接点击时,出现“使用360安全浏览器下载”的选项想知道,这样的菜单项是怎么实现的。
另外360浏览器在点击右键时,右键菜单的样式也发生了变化,这是怎么做到的?能解决此问题的,另外开贴有分相送

解决方案 »

  1.   

    Google "IDocHostUIHandler.ShowContextMenu"
      

  2.   


    好主意,同样在关注google tester社区。用注册表是好方法。
    360应该是这样做的,你在其页面上会向其后台发送请求,然后在你的注册表里面临时注册的项。
      

  3.   

    ShowContextMenu好像确实可以用,不过增加菜单项有没有例子呀,在网上没找到如果获取菜单,并增加菜单项的C#的例子
      

  4.   

    既然加载自己的菜单,就应该在菜单显示之前由自己来控制菜单项状态。通常从右键所指的对象查询IOleCommandTarget接口,然后调用IOleCommandTarget::QueryStatus方法来获取命令是否被支持,根据结果设置对应菜单项的状态。
      

  5.   

    7楼的,不是要加载自己的菜单,而是修改原有的IE右键菜单,网上找到了一个C++的代码,不过对C++不是很熟悉,不是很明白
    贴出来看看吧
    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;