`
yingyingol
  • 浏览: 767584 次
文章分类
社区版块
存档分类
最新评论

如何禁用HTML页面的上下文菜单

 
阅读更多
提出问题:
VC知识库《在线杂志》第六期有一篇文章“VC6中使用CHtmlView在对话框控制中显示HTML文件”,很多读者来信说很喜欢这种功能。但是美中不足的是在对话框的HTML页面上单击鼠标右键会弹出上下文菜单。从而可以象在IE中那样看到页面的源代码。为了防止用户查看HTML代码,有人尝试过在CHtmlCtrl派生的窗口中重载WM_CONTEXTMENU,或者在CHtmlView以及CHtmlCtrl类中禁用右键的上下文菜单和弹出式菜单,这两个方法都没有成功。那么如何禁用HTML的这个上下文菜单呢? 本文就针对这个问题用不同的方法来完善上次的程序。
解答:
CHtmlCtrl类可以将CHtmlView转换成在任何窗口中使用的控制。我用它写了一个程序叫AboutHtml,此程序实现了一个HTML对话框。但疏忽了鼠标右键的上下文菜单,所以在HTML对话框中单击鼠标右键,会弹出标准的浏览器上下文菜单(如图一),而这个菜单对于某些人来说可能是多余的。

图一 不想要的上下文菜单
其实,要解决这个问题有一个非常简单的办法,真是易如反掌,甚至不用写任何C++代码!只要在HTML页面中加一行指令即可:

这条指令告诉浏览器不要显示上下文菜单。也可以象下面这样写:
ShowMyMenu是一个显示定制菜单的JavaScript过程。本文例子代码之一AboutHtml1使用的就是oncontextmenu。源代码可以从本文的开始处下载。
由于VC知识库是一个关于C++以及Visual C++的网站,与JavaScript之类的脚本语言没什么关系。所以我们要用另一种稍微复杂一点的方法来实现相同的事情,那就是用C++来做。为此,正规的C++方法是实现IDocHostUIHandler接口,而且要做的事情很多。至于为什么要实现它,请参见有关文档。用WM_CONTEXTMENU 或者 WM_RBUTTONDOWN来处理这个问题的思路的确是通常Windows做事情的方式。但是问题是CHtmlCtrl窗口不是真正的输入窗口。窗口有很多种,只要用Spy++工具看一下我们的例子程序就知道在你眼前会出现多少种窗口。如图二所示,在实际的输入窗口上,浏览器窗口有三级父/子窗口。
它是个接收输入的Internet Explorer_Server服务器窗口,并且如果你想要截获WM_CONTEXTMENU消息,必须子类化这个窗口。在MFC中,这意味着你必须获取HWND并调用SubclassWindow。记住了,这是一种非常规方式,而且微软的那帮家伙也明确禁止这样做,不过我还是根据原来的程序写了另一个版本AboutHtml2,我这么做了。
图二在Spy++中的父/子关系
获得这个神秘的Internet Explorer_Server HWND的方法有很多种。但FindWindow不行,因为它只能得到顶层窗口。由于此服务器窗口是浏览器的曾孙(great-grandchild),在所有层次上都没有同胞兄弟,所以下列算法成立:
这个函数假设只有单子继承链,如同浏览器中的一个窗口——即每个父窗口肯定有一个子窗口——并且获取最末尾(或最小)的子窗口就是Internet Explorer_Server窗口。一旦取得HWND,剩下的事情便是写一个新的MFC类对它进行子类化。

这个类重载WM_CONTEXTMENU,其它什么事情也不做:OnContextMenu是个空函数,返回的东西不显示菜单,也不调用基类(CWnd)的方法。使用CMyIEWnd时,在CMyHtmlCtrl中添加一个实例:

把这一切联系在一起的最关键的一步是调用SubclassWindow。但在哪里调用以及什么时候调用呢?最好时机是在浏览器加载页面之后。

具体处理过程是这样的:当用户打开“关于”对话框,对话框创建CHtmlCtrl窗口来打开文档,当浏览器将文档打开以后,它发送一个通知,MFC将这个通知定向到OnNavigateComplete2。CMyHtmlCtrl::OnNavigateComplete2调用GetLastChild来获得“真正的”输入窗口并将它子类化。这时所有的消息将通过CMyIEWnd类去往Internet Explorer_Server,包括WM_CONTEXTMENU。这里要注意,IE的HWND是可以修改的,所以如果除了“关于”对话框外,你还想做一些其它的事情的话,必须要对HWND进行反子类化(unsubclass)和重子类化(resubclass)处理。
使用这个技术有两个重要事情需要注意。第一,它功能很强,因为你子类化了“真正的”IE窗口,你可以做几乎任何事情。第二,如果你不小心而使用不当,那将会发生最糟糕最糟糕的事情。一旦你用这种方法控制了资源管理器窗口,等于是把所有赌注放进去了。记住不要用不正当的方式去玩弄浏览器,而是要通过正式接口(IDocHostUIHandler)定制它!否则后果不堪设想。
分享到:
评论

相关推荐

    《如何禁用HTML页面的上下文菜单》配套VC源代码2

    但是美中不足的是在对话框的HTML页面上单击鼠标右键会弹出上下文菜单。从而可以象在IE中那样看到页面的源代码。为了防止用户查看HTML代码,有人尝试过在CHtmlCtrl派生的窗口中重载WM_CONTEXTMENU,或者在CHtmlView...

    jQuery Context Menu - jQuery上下文菜单插件

    总结,jQuery Context Menu插件提供了一个方便的方式来创建和管理页面上的右键上下文菜单,它具有高度可定制性和灵活性,适用于各种网页应用,如网页编辑工具、数据管理界面等。通过学习和使用这个插件,开发者可以...

    纯JavaScript右键上下文菜单插件

    在网页开发中,右键上下文菜单通常是增强用户交互体验的重要元素。class2context插件就是专为实现这一功能而设计的一款纯JavaScript解决方案,它无需依赖任何外部库,如jQuery,尽管在标签中提到了jQuery库,但...

    《如何禁用HTML页面的上下文菜单》配套VC源代码1

    但是美中不足的是在对话框的HTML页面上单击鼠标右键会弹出上下文菜单。从而可以象在IE中那样看到页面的源代码。为了防止用户查看HTML代码,有人尝试过在CHtmlCtrl派生的窗口中重载WM_CONTEXTMENU,或者在CHtmlView...

    禁用页面及页面所有frame内的右键菜单

    标题 "禁用页面及页面所有frame内的右键菜单" 涉及到的是网页交互中的一个常见需求,即阻止用户在网页或特定框架内通过鼠标右键点击打开默认的上下文菜单。这通常用于增强用户体验,防止用户无意或有意地复制、查看...

    abouthtml3.rar_win32 html

    描述中提到了两个主要知识点:一是动态生成并显示HTML文档,二是如何禁用HTML的上下文菜单。 **动态生成并显示HTML文档** 在Win32环境下,动态生成并显示HTML文档通常涉及使用ActiveX控件或者WebBrowser组件。...

    Flash+js禁用flash右键

    然而,Flash有一个特点,那就是用户可以通过鼠标右键点击Flash对象来访问其内置的上下文菜单,这可能导致内容被复制或者用户访问到不必要的设置。 禁用Flash右键菜单通常是通过Flash ActionScript实现的。...

    html禁止复制另存

    网页上的右键点击通常会弹出一个上下文菜单,允许用户复制、另存图片或查看网页源代码。为了阻止这一行为,我们可以利用JavaScript的`oncontextmenu`事件处理函数。例如: ```html document.oncontextmenu = ...

    Web右键菜单 很不错的右键菜单

    在网页设计中,右键菜单通常是指用户在网页上点击鼠标右键时出现的上下文菜单。这个菜单提供了用户与页面交互的额外功能,比如"查看源代码"、"保存图片"或"复制链接地址"等。在标题和描述中提到的"Web右键菜单 很...

    鼠标右键 禁用右键与禁用解除

    这段代码的作用是:当用户尝试右键点击页面时,会弹出一个提示框显示“右键被禁用”,同时阻止了默认的上下文菜单弹出。 ##### 2.2 使用`oncontextmenu`事件 除了上面提到的`onmousedown`事件之外,还可以利用`...

    右键禁用,右键禁用asp.net右键禁用

    在网页浏览过程中,用户通常可以通过鼠标右键调出浏览器默认的上下文菜单,进行诸如复制、粘贴、查看页面源代码等操作。然而,在某些应用场景下,如保护网站内容不被轻易复制或提供更加简洁的用户体验界面时,开发者...

    禁用鼠标右键

    在网页上,右键点击通常会显示浏览器的上下文菜单,包括“查看源代码”、“保存图片”等选项。禁用鼠标右键主要是为了防止用户通过这些方式获取或修改不应被轻易访问的信息。 在网页环境中,禁用鼠标右键通常是通过...

    jquery-contextMenu右键(左键)菜单插件

    `jQuery-contextMenu`是一款强大的JavaScript插件,专为创建功能丰富的上下文菜单而设计,能够处理大量的元素。...通过理解并熟练运用上述知识点,开发者可以轻松地在网页中实现功能强大的上下文菜单系统。

    网页使用JS禁用鼠标的几种方法

    另一种方法是直接在HTML元素上使用`oncontextmenu`属性,该属性可以在用户试图打开上下文菜单时触发。 **示例代码:** ```html ``` 这段代码会阻止浏览器默认的右键菜单弹出,从而达到禁用右键的效果。 #### 3....

    网页特效代码 右键菜单的制作![精华]

    在网页开发中,右键菜单(又称上下文菜单)是用户通过鼠标右键点击页面时弹出的菜单。它为用户提供了一些快捷操作选项,如查看页面源代码、保存图片等。自定义右键菜单可以为用户提供更加个性化的交互体验,增强网站...

    HTML转EXE工具(支持win32和win64,WebView2 (Chromium) 浏览器内核)

    4. 优化右键上下文菜单,禁用获取代码等菜单 5. 工具及生成的EXE程序都支持4K显示(H_DPI)及普通显示 6. 生成的EXE文件进行了压缩,比原来版本大小缩减超过50% 7. 支持程序图标自定义 8. 支持程序标题自定义 9. ...

    jQuery鼠标右键点击显示菜单.zip

    在网页交互设计中,鼠标右键点击通常被用作浏览器的默认上下文菜单,如“复制”、“粘贴”等操作。然而,通过JavaScript和jQuery,我们可以自定义这个行为,创建个性化的右键点击菜单,提升用户体验。本文将深入探讨...

    jquery右键菜单插件

    `jQuery contextmenu` 提供了丰富的配置选项,如 `appendTo`(指定菜单插入的位置)、`delegate`(代理选择器,用于处理子元素的上下文菜单事件)等。此外,还可以通过 `$.fn.contextmenu.defaults` 修改全局默认...

    一个屏蔽MFC IE Web控件右键菜单的小例子

    标题中的“一个屏蔽MFC IE Web控件右键菜单的小例子”表明了这是一个关于MFC(Microsoft Foundation Classes)编程的示例,主要涉及如何在使用IE Web控件时禁用或“屏蔽”用户右键点击时出现的上下文菜单。在Windows...

    网页不能使用右键的代码

    网页中的右键操作通常涉及到上下文菜单,这是用户在浏览网页时常见的交互方式。开发者有时出于特定需求,比如防止内容被复制或者保护页面元素不被误操作,可能会选择禁用网页的右键功能。本话题将详细介绍如何使用...

Global site tag (gtag.js) - Google Analytics