请教,我按照网上一些说法添加IE的右键菜单和响应的ATL,但是没有任何反应,
是否有哪位可以指点一下是怎么回事?多谢了!我是按下面这里的步骤做的,但是加了右键菜单和ATL之后,
那个MessageBox根本就没有弹出来:http://www.codeguru.com/cpp/misc/misc/internetexplorer/article.php/c11007/

解决方案 »

  1.   

    那个文章的方法可能和你的需要不一样.IDocHostUIHandler::ShowContextMenu 
      通过实现这一个方法, 你获得在当一个用户右击时被浏览器控件显示的快捷菜单的控制。你能通过在这个方法中返回S_OK 阻止IE显示它的默认快捷菜单。返回一些其他的数值 , 像S_FALSE或E_NOTIMPL,允许IE继续执行它的默认快捷菜单行为。 
      
      如果你仅仅在这个方法中返回S_OK, 你能避免任何浏览器控件的右击行为。 这可能是你在许多场合中的全部需求,但是你能做到更多。通常,你使用这一个方法在返回 S_OK 之前产生并且显示你自己的快捷菜单。如果你知道浏览器控件显示的菜单的资源,而且它如何选择他们,你能也有效地自定义默认的浏览器控件快捷菜单。让我们看看它如何工作。 
      
      浏览器控件由Shdoclc.dll获得它的快捷菜单资源。这个知识和一些 #define给予你一个机会操纵浏览器的菜单。让我们举例来说,假定你对默认菜单感到满意,除了你想要除去查看源代码项之外。下列代码载入来自Shdoclc.dll的浏览器控件快捷菜单资源,根据环境选择正确的菜单,移除IDM_VIEWSOURCE命令对应的菜单项,然后显示菜单。 
      
      例子   
      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<IOleCommandTarget> spCT;   
        CComPtr<IOleWindow> 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)   
        {   
          // 载入模块错误 -- 尽可能安全地失败   
          return;   
        } 
      
        hMenu=LoadMenu(hinstSHDOCLC,   
          MAKEINTRESOURCE(IDR_BROWSE_CONTEXT_MENU));   
        hMenu=GetSubMenu(hMenu,dwID);   
        //获得语言子菜单   
        hr = spCT->Exec(&CGID_ShellDocView, SHDVID_GETMIMECSETMENU, 0, NULL, &var);   
        mii.cbSize = sizeof(mii);   
        mii.fMask = MIIM_SUBMENU;   
        mii.hSubMenu = (HMENU) var.byref; 
      
        //加入语言子菜单到编码上下文菜单   
        SetMenuItemInfo(hMenu, IDM_LANGUAGE, FALSE, &mii); 
      
        //插入来自注册表的快捷菜单扩展   
        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); 
      
        //删除查看源代码   
        DeleteMenu(hMenu, IDM_VIEWSOURCE, MF_BYCOMMAND);   
        //显示快捷菜单   
        int iSelection = ::TrackPopupMenu(hMenu,   
          TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD,   
          ppt->x,  
          ppt->y,   
          0,   
          hwnd,   
          (RECT*)NULL);   
        //发送选定的快捷菜单项目指令到外壳   
        LRESULT lr = ::SendMessage(hwnd, WM_COMMAND, iSelection, NULL);   
        FreeLibrary(hinstSHDOCLC);   
        return S_OK;   
      

  2.   

    多谢楼上的热心回答,
    不过我不是要在程序里做浏览器控件,而是要在IE里点鼠标右键弹出菜单里有一个我的程序相关的项,
    就象FlashGet一样。
      

  3.   

    那你根本不需要用ATL对象, 你只需要修改注册表HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt即可啊!告诉你一种最简单的方法, 你去装一个FLASHGET, 看看安装前面上面的注册表位置的数据项变化,你就知道它是怎么做的了. 然后一样修改注册表即可.
      

  4.   

    这个有三步:
    1.注册表项
    2.htm文件
    3.由HTM文件调用的dll文件(里面有com对象,要注册)
      

  5.   

    这几个步骤我都知道,
    http://www.codeguru.com/cpp/misc/misc/internetexplorer/article.php/c11007/
    里面也写的很清楚,一步步都能做好,
    我要问的是这个DLL要怎么做,我按照那里面的做出来却没有反应。有没有哪位兄弟做过这个的?能否指点一下,这里是不是有什么步骤没有做对的?
    谢谢了!
      

  6.   

    应该不会的,我是按照这里面的来写的,
    而且如果用脚本的Alert的话是可以弹出来的,
    但是接到ATL上就不能弹出来,
    我在函数里面写一个ShellExecute要执行另外的程序也没有任何反应,
    但是如果接口的名字什么的写错了的话,
    IE就会出来一个对话框提示接口不支持,或者说Automation不能创建对象。
      

  7.   

    是否有哪位知道的?
    我把脚本里的Object换成FlashGet的Object是可以把FlashGet调起来的,
    为什么我的这个不可以呢?希望有哪位做过的指点一下,谢谢了!
      

  8.   

    http://www.codeguru.com/cpp/misc/misc/internetexplorer/article.php/c11007/
    上面网页中不是提供了源代码下载吗
    我刚下载下来,编译了一下,没问题