轻量级浏览器扩展与WebBrowser控件开发应用
1. 轻量级浏览器扩展
轻量级浏览器扩展是扩展IE框架和页面功能的绝佳方式,无需深入复杂的COM编程。它既简单又完整,能为IE和项目带来有趣且有创意的附加功能场景。
-
自定义上下文菜单
:通过特定的标记、脚本和样式,可以创建出基于JavaScript的上下文菜单。当用户在页面上右键点击时,会显示一个通过
<div>块模拟的上下文菜单,并且当用户将焦点移出打开的菜单时,菜单会自动关闭。示例样式代码如下:
.contextMenu a:hover { text-decoration: underline !important; }
轻量级扩展在浏览器框架和单个页面中都发挥着重要作用,不仅可以扩展IE本身,还能对页面进行扩展。同时,还可以通过纯JavaScript解决方案开发自定义菜单,而无需在用户计算机上安装扩展。
2. WebBrowser控件开发应用
随着Web平台(如HTML、JavaScript等)的发展,它不仅在浏览器领域取代了原生代码平台,在通用应用开发中也越来越受欢迎。许多非浏览器程序都使用标记、样式和脚本作为核心功能和用户界面的基础。而Microsoft的WebBrowser控件是一个基于COM的库集合,可由应用程序托管以渲染网页内容,它几乎能完成IE的所有功能。
2.1 准备使用WebBrowser控件
要使用WebBrowser控件,首先需要为.NET互操作准备SHDocVw和MSHTML的ActiveX控件和类型库。具体操作步骤如下:
1. 使用
.NET SDK
提供的
aximp
应用程序将
SHDocVw DLL
文件(位于
System32
目录)导入并分析,以便在托管代码中使用。命令如下:
aximp %windir%\system32\shdocvw.dll
-
使用
tlbimp工具处理MSHTML的类型库,命令如下:
tlbimp %windir%\system32\mshtml.tlb
执行上述命令后,会生成两个程序集:
SHDocVw.dll
和
AxSHDocVw.dll
。可以将这些库添加到Visual Studio项目的引用中,之后就可以将这些库中的控件加载为窗体应用程序的交互式控件,或用于访问浏览器功能。
2.2 创建WebBrowser控件实例
从前面准备的库中导入的WebBrowser控件(
AxWebBrowser
,
AxSHDocVw
的一个组件)需要以编程方式添加到Windows窗体或类中。以下是一个基本应用的示例代码:
public partial class BrowserBasic : Form
{
public AxWebBrowser Browser;
// ... other objects
public BrowserBasic()
{
// Initialize the component (designer)
InitializeComponent();
// Initialize the WebBrowser control
InitializeWebBrowser();
}
public void InitializeWebBrowser()
{
// Create a new instance of the WebBrowser control
Browser = new AxWebBrowser();
// Add the control to the main form and dock it inside
// of a panel
this.Controls.Add(Browser);
Browser.Parent = this;
Browser.Dock = DockStyle.Fill;
// Finish initializing the ActiveX
Browser.EndInit();
}
}
在这个示例中,
BrowserBasic
类定义了一个
AxWebBrowser
类型的变量
Browser
,并在构造函数中调用
InitializeWebBrowser
方法来创建并初始化WebBrowser控件实例。
2.3 基本导航功能实现
创建的窗体应用程序包含一个简单的工具栏,其中有用于输入URL的文本框和几个按钮(如“Go”、“Back”、“Forward”、“Home”、“Stop”等),这些按钮用于实现基本的网页导航功能。以下是部分按钮事件处理程序的代码:
private void GoButton_Click(object sender, System.EventArgs e)
{
// Navigate to the address found in the address text box
Browser.Navigate(AddressBox.Text);
}
private void AddressBox_KeyPress(object sender, KeyPressEventArgs e)
{
// If enter was pressed, tread as if the "go" button was hit
if (e.KeyChar == (char)Keys.Enter)
Browser.Navigate(AddressBox.Text);
}
private void BackButton_Click(object sender, System.EventArgs e)
{
// Go back in the travel log
Browser.GoBack();
}
private void ForwardButton_Click(object sender, System.EventArgs e)
{
// Go forward in the travel log
Browser.GoForward();
}
private void HomeButton_Click(object sender, System.EventArgs e)
{
// Go to the user's home page
Browser.GoHome();
}
private void StopButton_Click(object sender, System.EventArgs e)
{
// Stop the current navigation
Browser.Stop();
}
这些事件处理程序分别实现了根据输入的URL导航、后退、前进、返回主页和停止当前导航的功能。
2.4 处理基本事件
IE的API提供了一个事件驱动系统,开发者可以根据WebBrowser对象内发生的事件来定制应用程序的功能。以下是一个处理WebBrowser事件的示例代码:
public class BrowserEventHandling : BrowserBasic
{
public BrowserEventHandling(): base()
{
// Latch onto the DWebBrowserEvents2 events omitted by the
// WebBrowser control
HandleBasicEvents();
}
private void HandleBasicEvents()
{
// Add handlers to some of the basic web browser events
Browser.BeforeNavigate2 += Browser_BeforeNavigate2;
Browser.DocumentComplete += Browser_DocumentComplete;
Browser.FileDownload += Browser_FileDownload;
Browser.NavigateComplete2 += Browser_NavigateComplete2;
Browser.NavigateError += Browser_NavigateError;
Browser.NewProcess += Browser_NewProcess;
Browser.NewWindow2 += Browser_NewWindow2;
}
void Browser_NewWindow2(object sender, DWebBrowserEvents2_NewWindow2Event e)
{
Debug.WriteLine("Event: DWebBrowserEvents2 NewWindow2");
}
void Browser_NewProcess(object sender, DWebBrowserEvents2_NewProcessEvent e)
{
Debug.WriteLine("Event: DWebBrowserEvents2 NewProcess");
}
// ... 其他事件处理程序
}
在这个示例中,
BrowserEventHandling
类继承自
BrowserBasic
类,并在构造函数中调用
HandleBasicEvents
方法来为WebBrowser控件的多个事件添加处理程序。当相应事件触发时,会执行对应的事件处理程序。
3. 访问对象模型
当WebBrowser控件成功加载并解析网页后,通过Trident(IE的布局和渲染引擎)处理的网页内容会通过一系列COM对象暴露给开发者,这些对象共同构成了对象模型。
3.1 附加到文档和窗口对象
WebBrowser控件的大多数顶级属性、方法和事件在控件初始化后即可使用,但像基于
IHTMLDocument
和
IHTMLWindow
的对象,只有在WebBrowser控件加载并解析、布局和渲染页面后才可用。开发者在访问这些对象时,需要确保文档类型是HTML文档,并且
IHTMLDocument
对象确实存在于加载的文档实例中。
以下是一个示例应用的构造函数代码,该应用用于分析浏览器解析的HTML并处理相关对象生成的事件:
public class BrowserModelAccess : BrowserEventHandling
{
TextBox PageReport;
bool eventsSunk = false;
public BrowserModelAccess() : base()
{
// Register for the NavigateComplete event for both the
// link report and the script error handling
Browser.NavigateComplete2 += Browser_NavigateComplete2;
}
void Browser_NavigateComplete2(object sender, DWebBrowserEvents2_NavigateComplete2Event e)
{
// Pass the valid document and window objects and build
// a link report on the document
BuildLinkReport();
// Sink script errors for this window instance
if(!eventsSunk) {
eventsSunk = true;
SinkScriptErrorEvents();
}
}
}
在这个示例中,构造函数为
NavigateComplete2
事件添加了处理程序,当该事件触发时,会调用
BuildLinkReport
方法生成文档中所有链接的报告,并调用
SinkScriptErrorEvents
方法处理脚本错误事件。
3.2 访问浏览器对象模型
通过WebBrowser控件的
Document
成员可以访问实现了
IHTMLDocument
接口的对象实例,进而访问其包含的子对象。以下是一个报告
IHTMLDocument2
对象上所有链接的函数代码:
void BuildLinkReport()
{
// Grab the document object from the WebBrowser control
IHTMLDocument2 document = Browser.Document as IHTMLDocument2;
if (document == null) return;
// Write the title and indicate the URL
Debug.WriteLine("\n\nLINK REPORT for " + document.url);
// Report the page URL, file size, and total number of links
Debug.WriteLine("URL: " + document.url);
Debug.WriteLine("Filesize: " + document.fileSize.ToString());
Debug.WriteLine("Total Links: " + document.links.length.ToString());
// Display all the links on the current page
foreach (IHTMLAnchorElement link in document.links)
Debug.WriteLine(" >> href=" + link.href);
}
该函数首先获取WebBrowser控件中的文档对象,然后输出文档的标题、URL、文件大小和链接总数,并遍历文档中的所有链接,输出每个链接的
href
值。
3.3 处理对象模型事件
WebBrowser控件的
IHTMLDocument
实现实例下的对象都有各自的事件,应用程序可以访问和处理这些事件,甚至可以实现与页面上JavaScript相同的事件。以下是一个替换IE的JavaScript错误对话框的示例代码:
void SinkScriptErrorEvents()
{
// Turn off default script errors
Browser.Silent = true;
// Grab the document object from the WebBrowser control
IHTMLDocument2 document = (IHTMLDocument2)Browser.Document;
if (document == null) return;
// Grab the window object from the document object
HTMLWindow2 window = (HTMLWindow2)document.parentWindow;
if (window == null) return;
// Cast the window object to the window events interface
HTMLWindowEvents2_Event windowEvents = (HTMLWindowEvents2_Event)window;
if (windowEvents == null) return;
// Attach to the error event on the window object
// 后续可添加具体的错误处理逻辑
}
该函数首先通过设置
Browser.Silent
属性关闭默认的脚本错误报告,然后获取文档对象和窗口对象,并将窗口对象转换为事件接口类型,最后可以为窗口对象的错误事件添加自定义处理程序。
通过以上内容,我们可以看到如何利用轻量级浏览器扩展和WebBrowser控件来开发具有丰富功能的应用程序,包括自定义上下文菜单、实现基本的网页导航和事件处理,以及访问和操作网页的对象模型。这些技术为开发者提供了强大的工具,能够创建出更加灵活和功能丰富的应用。
4. 总结与应用场景
轻量级浏览器扩展和WebBrowser控件开发应用为开发者提供了丰富的功能和灵活性,以下是对其总结以及一些常见的应用场景。
| 技术特性 | 描述 |
|---|---|
| 轻量级浏览器扩展 | 无需深入COM编程,简单完整,可扩展IE框架和页面功能,支持自定义上下文菜单等 |
| WebBrowser控件 | 基于COM的库集合,能完成IE的大部分功能,可集成到各种应用中,支持事件处理和对象模型访问 |
4.1 应用场景
- 嵌入式浏览器应用 :在桌面应用程序中嵌入WebBrowser控件,使应用能够显示和处理网页内容,如开发一个新闻阅读器,通过WebBrowser控件加载新闻网页。
- 自动化测试工具 :利用WebBrowser控件的事件处理和对象模型访问功能,可以编写自动化测试脚本,模拟用户操作,对网页进行功能测试。
- 自定义浏览器 :结合轻量级浏览器扩展和WebBrowser控件,开发具有自定义功能的浏览器,如添加特定的上下文菜单、实现个性化的导航功能等。
5. 开发流程总结
下面是使用WebBrowser控件开发应用的主要流程:
graph LR
A[准备工作] --> B[导入SHDocVw和MSHTML库]
B --> C[创建WebBrowser控件实例]
C --> D[实现基本导航功能]
D --> E[处理基本事件]
E --> F[访问对象模型]
- 准备工作 :包括导入SHDocVw和MSHTML的ActiveX控件和类型库,为.NET互操作做准备。
- 创建实例 :通过编程方式在Windows窗体或类中创建WebBrowser控件实例。
- 导航功能 :实现基本的网页导航功能,如根据输入的URL导航、后退、前进等。
- 事件处理 :利用IE的API提供的事件驱动系统,为WebBrowser控件的各种事件添加处理程序。
- 对象模型访问 :在WebBrowser控件加载并解析网页后,访问和操作网页的对象模型。
6. 注意事项
在使用轻量级浏览器扩展和WebBrowser控件开发应用时,需要注意以下几点:
-
COM编程基础
:虽然轻量级浏览器扩展无需深入COM编程,但了解一些基本的COM概念有助于更好地理解和使用相关技术。
-
对象模型访问
:在访问基于
IHTMLDocument
和
IHTMLWindow
的对象时,要确保文档类型是HTML文档,并且对象确实存在于加载的文档实例中。
-
事件处理
:事件处理程序的编写要考虑到性能和稳定性,避免出现死循环或资源泄漏等问题。
7. 未来发展趋势
随着Web技术的不断发展,轻量级浏览器扩展和WebBrowser控件开发应用也将不断演进。未来可能会有以下发展趋势:
-
跨平台支持
:目前WebBrowser控件主要基于Windows平台,未来可能会有更多的跨平台解决方案,使开发者能够在不同的操作系统上使用类似的技术。
-
与现代Web技术的融合
:如与HTML5、CSS3和JavaScript的新特性更好地融合,提供更丰富的用户体验。
-
安全性提升
:随着网络安全问题的日益突出,未来的技术将更加注重安全性,提供更多的安全机制和防护措施。
轻量级浏览器扩展和WebBrowser控件开发应用为开发者提供了强大的工具和丰富的功能,通过合理运用这些技术,可以开发出具有创新性和实用性的应用程序。在未来的发展中,这些技术将不断适应新的需求和挑战,为Web开发领域带来更多的可能性。
超级会员免费看
1万+

被折叠的 条评论
为什么被折叠?



