请教,我按照网上一些说法添加IE的右键菜单和响应的ATL,但是没有任何反应,
是否有哪位可以指点一下是怎么回事?多谢了!我是按下面这里的步骤做的,但是加了右键菜单和ATL之后,
那个MessageBox根本就没有弹出来:http://www.codeguru.com/cpp/misc/misc/internetexplorer/article.php/c11007/
是否有哪位可以指点一下是怎么回事?多谢了!我是按下面这里的步骤做的,但是加了右键菜单和ATL之后,
那个MessageBox根本就没有弹出来:http://www.codeguru.com/cpp/misc/misc/internetexplorer/article.php/c11007/
通过实现这一个方法, 你获得在当一个用户右击时被浏览器控件显示的快捷菜单的控制。你能通过在这个方法中返回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;
}
不过我不是要在程序里做浏览器控件,而是要在IE里点鼠标右键弹出菜单里有一个我的程序相关的项,
就象FlashGet一样。
1.注册表项
2.htm文件
3.由HTM文件调用的dll文件(里面有com对象,要注册)
http://www.codeguru.com/cpp/misc/misc/internetexplorer/article.php/c11007/
里面也写的很清楚,一步步都能做好,
我要问的是这个DLL要怎么做,我按照那里面的做出来却没有反应。有没有哪位兄弟做过这个的?能否指点一下,这里是不是有什么步骤没有做对的?
谢谢了!
而且如果用脚本的Alert的话是可以弹出来的,
但是接到ATL上就不能弹出来,
我在函数里面写一个ShellExecute要执行另外的程序也没有任何反应,
但是如果接口的名字什么的写错了的话,
IE就会出来一个对话框提示接口不支持,或者说Automation不能创建对象。
我把脚本里的Object换成FlashGet的Object是可以把FlashGet调起来的,
为什么我的这个不可以呢?希望有哪位做过的指点一下,谢谢了!
上面网页中不是提供了源代码下载吗
我刚下载下来,编译了一下,没问题