分享
 
 
 

屏蔽CHtmlView\CWebBrower2右键菜单的非官方方法

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

本文源代码:http://msdn.microsoft.com/msdnmag/issues/01/09/code/CQA0109.exe

在看这篇文章之前你首先要了解IE控件、CHtmlView。

包罗的CHtmlCtrl类由CHtmlView派生而来,其利用CHtmlView的LoadFromResource函数从资源中打开网页。

问题1:我很喜欢你的 CHtmlCtrl类,那正是我所需要做的。但有一点我想知道,能够禁止用户右键网页时候弹出菜单么?我不想用户看到我的HTML源文件。我重载了CHtmlCtrl的WM_CONTEXTMENU消息映射,结果没什么用处。

问题2:我想禁止CHtmlView或者CWebBroser2弹出鼠标右键菜单,我重载了WM_RBUTTONDOWN的消息映射函数,但不行,请帮助!

回答:很高兴你们喜欢我的CHtmlCtrl类,在当时我没有考虑到这个不受欢迎的右键菜单,现在我把禁止右键菜单的简便方法指出:

只需要一行----在你的HTML里面这样写BODY

<BODY oncontextmenu="return false">

它将告诉浏览器:嘿,别显示另人讨厌的右键菜单!

像下面这样你可以构造自己的菜单:

oncontextmenu="ShowMyMenu(); return false"

ShowMyMenu可以是一段JAVASCRIPT,用来创建自己的个性化菜单。

但我们这里是对C++的谈论,大谈JAVASCRIPT有些不适合,那么------让我用C++实现这个,官方提供的方法是利用IDocHostUIHandler接口(在http://www.codeguru.com有利用IDocHostUIHandler禁止CHtmlView右键菜单的范例) ,但是这样做太麻烦了,而这对不懂COM的程序员将是再痛苦不过的经历!

你们的想法是重载WM_CONTEXTMENU 或WM_RBUTTONDOWN的消息映射,的确,大部分窗口是他们。但这里不行。

原因是:CHtmlView、CWebBrowser2不是真正的输入窗口,这有着很多我们肉眼没有看见的窗口。为了看到这些窗口,我们打开VC++的窗口工具spy++看个究竟。

Dialog

AfxFrameOrView42d // CHtmlCtrl

Shell Embedding

Shell DocObject View

Internet Explorer_Server

如图:浏览窗口中有三个父/子窗口在真正的输入窗口上面,如此说来 WM_CONTEXTMENU 和 WM_RBUTTONDOWN消息能被输入窗口获得么?

Internet Explorer_Server 窗口接受到了输入,这意味着你想处理WM_CONTEXTMENU就必须通过subclass来处理这个窗口的消息。

为此我们必须知道Internet Explorer_Server的句柄。

这有许多办法获得 Internet Explorer_Server 的句柄,FindWindow 不会有效果,因为他只能找到顶层窗口(111222注:笔者没有想到FindWindowEx,通过Ex函数可以找到任何窗口)。下面是我写的用来获得该窗口的函数,利用GetWindow

static HWND GetLastChild(HWND hwndParent)

{

HWND hwnd = hwndParent;

while (TRUE) {

HWND hwndChild = ::GetWindow(hwnd, GW_CHILD);

if (hwndChild==NULL)

return hwnd;

hwnd = hwndChild;

}

return NULL;

}

因为 Internet Explorer_Server 是IE控件、CHtmlView唯一的子窗口,所以我们利用GetLastChild找到的句柄是准确的。

下面我们重载WM_CONTEXTMENU的消息映射:

class CMyIEWnd : public CWnd {

public:

afx_msg void OnContextMenu(CWnd* pWnd, CPoint pos) { }

DECLARE_MESSAGE_MAP();

};

WM_CONTEXTMENU的消息影射什么也不做,OnContextMenu 是一个空函数时候将不显示菜单。

下面应用这个CMyIEWnd,我把它作为成员变量加到CMyHtmlCtrl之中:

class CMyHtmlCtrl : public CHtmlCtrl {

protected:

CMyIEWnd m_myIEWnd;

};

上面所有的一切都必须在通过subclass钩取 Internet Explorer_Server 的窗口之后才能有效,那么我们在哪做呢?

随便那都可以,下面我们是网页浏览完毕后禁止右键菜单。

void CMyHtmlCtrl::OnNavigateComplete2(LPCTSTR strURL)

{

if (!m_myIEWnd.m_hWnd) {

HWND hwnd = GetLastChild(m_hWnd);

m_myIEWnd.SubclassWindow(hwnd);

}

}

OK~~所有的工作都完成了,下面我来讲解一下它的实际过程:当用户打开了关于对话框,该对话框创建CHtmlCtrl窗口打开HTML文档。在打开文档完毕后将发送它将触动OnNavigateComplete2,CMyHtmlCtrl::OnNavigateComplete2 此时将会找到Internet Explorer_Server ,并且通过SubclassWindow将其一些消息处理都归谬于CMyIEWnd ,CMyIEWnd 的 WM_CONTEXTMENU此时毫无作为,最终右键菜单不见了。

必须指出的是:Internet Explorer_Server 窗口句柄经常性改变,所以我们必须为显示HTML的关于对话框做更多的东西。

你必须有效的用unsubclass 和 resubclass。

至此用非官方方法禁止CWebBrowser控件\CHtmlView右键菜单的方法介绍完毕。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有