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

如何禁用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...

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

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

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

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

    Webmaster menu-crx插件

    浏览器上下文菜单的可用项目列表:-打开Goog​​le PageSpeed-HTML验证器-CSS验证器-StructuredData验证器-检查站点图标-Yandex IKS站点-Alexa交通排名-Google搜索中的页面站点-Yandex搜索中的页面站点-打开机器人....

    HTML DOM导航「HTML DOM Navigation」-crx插件

    -网页完全加载后,单击页面右上方的“ HTML DOM导航”图标-将鼠标悬停在页面中的任何元素上,以查看IRB格式和元素的前五位祖先-右键单击页面,然后在上下文菜单中选择“ HTML DOM导航->树格式”选项以查看(整个...

    保存页面我们「Save Page WE」-crx插件

    上下文菜单和按钮菜单要将网页另存为HTML文件,或对先前保存的页面执行操作,请右键单击页面内容以打开上下文菜单,选择“保存页面WE”子菜单,然后然后选择菜单项之一:•保存基本项目•保存标准项目•保存自定义...

    HTML DOM Navigation-crx插件

    -网页完全加载后,单击页面右上方的“ HTML DOM导航”图标-将鼠标悬停在页面中的任何元素上,以查看IRB格式和元素的前五位祖先-右键单击页面,然后在上下文菜单中选择“ HTML DOM导航->树格式”选项以查看(整个主体...

    动态生成并显示 HTML 文档VC源代码

    本程序示例了如何利用一个从 CHtmlView 派生的新类 CHtmlCtrl 在...此外该程序还示范了如何动态构造 HTML 文档串以及禁用浏览器的上下文菜单。 关键字:CHtmlView,CHtmlCtrl,menu,context menu,web,Win32,Handle,HTML

    bbCodeInsert-crx插件

    “ bbCode插入”上下文菜单仅对可编辑表单元素(例如文本区域和文本行条目)可见。 一些菜单项具有快捷键。 仅在通过键盘(上下文菜单键)或鼠标使用菜单选项后,快捷键才起作用。 禁用了用于激活快捷键的提示...

    超实用的jQuery代码段

    2.14 禁用右键单击上下文菜单 2.15 IE下禁用文本选择功能 2.16 输入框获取焦点时文本高亮提示 2.17 实现多个输入框同步操作 2.18 在新窗口中打开外部链接 2.19 jQuery实现outerHTML属性 2.20 实现带固定表头的表格 ...

    GIF Blocker-crx插件

    请注意,用户仍然可以通过使用图像上的右键单击上下文菜单选项来有选择地加载被阻止的图像。 从版本0.1.1开始,可以在选项页面上添加或删除扩展名阻止的图像格式。 另外,只需单击工具栏按钮,就可以完全关闭扩展...

    Wallabagger-crx插件

    启用/禁用指示的选项v1.2中的新增功能-用于背景保存的热键-用于保存页面和链接的上下文菜单-用于goto的上下文菜单项wallabag页面-标记工作的改进-Webextension兼容性-可以在Firefox浏览器中使用v1.1中的新增功能-...

    jQuery攻略.pdf

    128 4.17 小结 132 第5章 页面导航 133 5.1 编写面包屑菜单 133 5.2 把悬停效果添加到菜单项 135 5.3 创建上下文菜单 137 5.4 创建具有快捷键的导航菜单 140 5.5 创建一个右键单击上下文菜单 144 5.6 创建具有独立...

    50个必备的实用jQuery代码段

    22. 如何禁用右键单击上下文菜单: 6 23. 如何定义一个定制的选择器 6 24. 如何检查某个元素是否存在 7 25. 如何使用jQuery来检测右键和左键的鼠标单击两种情况: 7 26. 如何显示或是删除input域中的默认值 7 27. ...

    Print Edit WE-crx插件

    基本操作要开始编辑页面,请单击主工具栏上的“打印编辑”按钮,或在上下文菜单上选择“打印编辑”>“开始编辑”。蓝色'编辑'(编辑)徽章将显示在按钮上。默认情况下禁用“Web样式”功能,以便显示页面看起来类似于...

    Bootstrap官网教程整理

    上下文类 50 响应式表格 52 Bootstrap 表单 54 表单布局 54 支持的表单控件 58 静态控件 63 表单控件状态 64 表单控件大小 67 表单帮助文本 69 Bootstrap 按钮 71 按钮大小 72 按钮状态 74 按钮标签 77 Bootstrap ...

    Work Offline-crx插件

    您现在可以使用右键单击上下文菜单项进行页面操作以使单个选项卡或多个选项卡转到脱机模式。仍然可以使用工具栏按钮使所有选项卡也在离线模式下工作。版本0.1.3.1.支持Navigator.online.2.支持“在线”和“离线”...

    离线办公「Work Offline」-crx插件

    现在,您可以使用右键单击上下文菜单项进行页面操作,以使单个选项卡或多个选项卡进入脱机模式。仍然可以使用工具栏按钮来使所有选项卡也都在脱机模式下工作。版本0.1.3 1.支持navigator.onLine 2.支持“在线”和...

    AutoplayStopper-crx插件

    •快速附加组件启用/禁用(left-dblclick)•对于覆盖的视频元素,将显示“播放/暂停”上下文菜单项。如果站点仍然自动播放,请尝试禁用闪光检测。发行说明:1.7.3版5/9/2019•修复了javascript:url iframe的变通...

Global site tag (gtag.js) - Google Analytics