适用于 .NET 1.0/1.1 的增强型 Web 浏览器控件






4.78/5 (38投票s)
2004年12月12日
7分钟阅读

904761

9196
为 Windows 内置的 Web 浏览器 (ActiveX) 控件提供增强功能。
快速入门
很简单:下载项目,运行它。如果由于引用问题无法编译,请参阅 '添加引用的 ActiveX 控件'。
引言
.NET 框架的下一个版本将提供 Microsoft Web Browser 控件的全面包装类——该控件是一个 COM 控件,被 IE 使用,并嵌入到 Explorer 中。这个新控件提供了人们费尽心思用 COM 去实现的所有功能,而无需费力地去浏览新闻组和技术文章。
嗯,我认为是时候为 .NET 1.0 / .NET 1.1 提供一个类似的控件了,所以我再次披挂上阵,开源了这款控件。
与标准的 AxWebBrowser
控件相比,此控件包含以下功能(标准控件需要您自己实现):
- Context menu
- 可选地在新窗口中打开所有链接
- 显示查找对话框
- 显示打印对话框
- 显示另存为对话框
- 显示打印预览对话框
- 禁用快捷键,如 CTRL+N、CTRL+F 和 Backspace
- 限制图片、Java、ActiveX
- 停止显示图片、声音、视频
- 禁用 JavaScript
- 禁用 ActiveX 和 Java 控件的下载/运行
- 开启或关闭 3D 边框的功能
- 开启或关闭滚动条
- 使所有窗体控件具有 XP 主题
- 简化的、功能更丰富的导航方法(具有更多选项的 Navigate,具有不同刷新选项的 Refresh)。
- 事件文档。
在某些方面,它甚至比 .NET 2.0 控件的功能更丰富,尽管 .NET 2.0 控件实现了安全模型以及其他一些属性,希望 WebBrowserEx
在其生命周期内也能加入这些功能。
它是如何实现的?
我将不详细介绍它的实现细节——网上有很多信息已经解释过了。请参阅“参考文献”部分,了解我获取信息的来源。该控件是一个用户控件,其中 AxWebBrowser
被停靠在全屏。我曾尝试从 AxWebBrowser
派生,但它不允许我添加属性,所以我放弃了该方法。这意味着在该控件中,许多属性和事件不得不被重新实现。这样做很枯燥,但实际上使得控件更加简洁,而不是拥有一个带有所有 ActiveX 属性的派生类。
IDocHostUIHandler 和上下文菜单
该控件实现了 IDocHostUIHandler
(请参阅“参考文献”了解其含义),它处理上下文菜单和按键限制。与 .NET 2.0 控件不同,我只保留了一个 ContextMenu
属性。您可以将其设置为一个空的 ContextMenu
,例如:
myBrowser.ContextMenu = new ContextMenu();
如果您不想要默认的 IE 上下文菜单。在 2.0 版本控件中,还有一个选项是不显示 IE 上下文菜单。如果对此有足够的需求,我将添加它。
IDispatch_Invoke_Handler 的传说
该控件还实现了 IOleClientSite
。同样,您可以在“参考文献”中阅读它的含义。控件中最晦涩和最重要的部分是 IDispatch_Invoke_Handler()
。我花了很长时间才弄清楚如何实现 IDispatch::Invoke
以限制 IE 显示的内容(如图片、ActiveX 控件、Java)。我发现,如果在代码中添加一个 COM dispatch 标识符为 -5512 的 IDispatch_Invoke_Handler()
方法,它就能为您完成工作。这是一个非常晦涩的答案,但它效果很好。然后,选项枚举与此配合,以设置您希望在浏览器中可用的选项。
我不认为 .NET 2.0 控件具有这些选项;希望 MS 中有与 .NET 相关的人员能够阅读此文并请求添加这些选项,因为它们对于该控件来说是相当核心的功能。
WebExecWB
该控件提供了一个更易于使用的 ExecWB
方法,该方法在执行之前会查询接口,从而修复了“Trying to revoke a drop target that has not been registered.”(尝试撤销未注册的拖放目标)等错误。打印、另存为等方法都使用了此包装调用。您会发现,有些 CMDID 常量不起作用。欢迎来到 COM 互操作的世界——我在制作这个控件时发现,微软在 MSDN 网站上提供的一些常量已经很多年不起作用了,而他们却一直没有更新文档。其中一些常量可能通过将 CurrentDocument
强制转换为 IOleCommandTarget
并调用其 Exec
方法(请参阅 Find
方法)来使用。据我所知,这基本上就是 ExecWB
方法所做的一切。
Flags designer
该控件实现了 Thierry Bouquain 的标志设计器,用于在设计器中设置选项标志。它目前将所有 COM 导入、接口和标志设计器编辑器都放在同一个文件中。这使得源代码有点庞大,但 nothing that regions doesn't overcome(区域可以克服)。在我看来,这也使控件更具独立性。
XP Service Pack 2
在 XP Service Pack 2 中,微软更新了浏览器的 MSHTML 部分,以便在 NewWindow
事件中提供更多选项(它被称为 NewWindowEvent3
)。我最初添加了这个,但后来意识到由于依赖关系失败,它会在大多数人的机器上出错。您可以很容易地将其添加到控件中,如果您想知道新窗口是如何创建的。
添加引用的 ActiveX 控件
下载项目时,您可能会发现缺少以下引用:
- AxInterop.SHDocVw.dll
- Interop.SHDocVw.dll
- Microsoft.mshtml.dll
我没有包含这些,因为它们依赖于操作系统。我运行的是 XP SP2,而您可能运行的是 Windows 2000、XP SP1 等,所以如果我包含它们,我的 DLL 将会与您的操作系统不兼容。
添加 Microsoft.mshtml.dll 非常简单;右键单击项目中的“添加引用”,然后添加以下内容:
添加 SHDocVw
有点奇怪。据我所知,您无法将其添加为引用,因此您必须将其添加到工具箱中,然后添加到控件的窗体上,之后再将其移除(这与 AxImp 工具和 VS.NET 有关,我不确定具体原因)。要做到这一点,请打开 WebBrowserEx
控件,使其处于设计器模式,然后转到您的工具箱,在上下文菜单中点击“添加/删除项”,并从“COM”选项卡中选择以下项:
将其添加到工具箱后,向 WebBrowserEx 项目添加一个临时窗体,将其拖放到窗体上,然后将其移除。这应该会将其添加到您的引用中。然后,做一个 voodoo dance(巫毒舞蹈)并编译,希望一切都会顺利。
我没有尝试在没有 VS.NET 的情况下进行编译,但使用 AxImp 工具和 SHDocVw.dll 添加引用应该足够直接了。
DOM 事件处理
我在控件中添加了对 MSHTML 文档事件的支持。这些事件允许您捕获文档中的 keydown、mouseclick 等事件——浏览器控件本身无法获得这些事件,因为它只是文档解析器的一个宿主。我添加的实现相当实验性,可以通过EnableHtmlDocumentHandling
属性进行切换。将其设置为 true 将会触发所有 HtmlDocument*
事件,但我需要强调的是,这些事件往往会吞噬您的按键和鼠标事件,并且似乎会让窗体的按键和链接点击变得混乱。我没有时间弄清楚原因,我可能会在某个下雨的星期天研究一下。
最后
控件中的方法和属性名称与 .NET 2.0 控件中的不匹配。有些相同,有些不同。我很难想象您会从这个控件升级到新的 .NET 2.0 控件,但如果这对大家来说是个大问题,我可以将其更改为所有属性名称和方法都相同。
我为控件添加的一个小细节是,包含了 MSDN 中 AxWebBrowser
所有事件的文档。
就是这样。希望这个控件能派上用场。