WebBrowser控件打开网页,如何屏蔽右键消息

tanwei1002 2009-05-11 10:11:37
我运行环境是VC6.0,现在WebBrowser控件打开网页时候,我想禁止在打开的网页上的右键操作。
希望得到指点 谢谢!~
...全文
640 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
tanwei1002 2009-05-12
  • 打赏
  • 举报
回复
已经解决了
是ShowContextMenu函数返回s_OK即可
谢谢了
tanwei1002 2009-05-12
  • 打赏
  • 举报
回复
上面函数是作为我程序的一个成员函数吗?

这个资料我没看过,我看下试下先 谢谢了
biweilun 2009-05-12
  • 打赏
  • 举报
回复
MSDN上也有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;

}

安全警告:不正确地使用LoadLibrary能载入错误的动态链接库(DLL)来威胁你的应用程序的安全。关于该如何正确地用微软Windows 的不同版本载入DLL的信息,参照LoadLibrary的文档。

这个资料你看过没?
tanwei1002 2009-05-12
  • 打赏
  • 举报
回复
网上搜索点资料
方法是获取IDocHostUIHandler接口,然后调用ShowContextMenu函数

但是具体如何操作还不清楚。我对这方面近乎文盲。。。
xiaoxiaofengqi 2009-05-12
  • 打赏
  • 举报
回复
用hook钩子试试
tanwei1002 2009-05-12
  • 打赏
  • 举报
回复
自己顶下

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧