利用 WebBrowser 控件开发应用及创建托管 ActiveX 控件
1. WebBrowser 控件应用开发
1.1 处理脚本错误
在使用 WebBrowser 控件时,我们可以对脚本错误进行处理。以下代码展示了如何在脚本错误发生时发送通知:
// will be sent a notification when a script error occurs
windowEvents.onerror += Browser_HTMLWindowEvents2_OnError;
接下来是错误处理函数:
void Browser_HTMLWindowEvents2_OnError(string description, string url, int line)
{
// Show a custom message box that displays the javascript
// error to the user
MessageBox.Show(String.Format(
"Description: {0}\n\nLine: {1}",
description,
line.ToString()),
"JavaScript Error",
MessageBoxButtons.OK,
MessageBoxIcon.Warning
);
}
这个函数会在脚本出错时弹出一个警告样式的消息框,显示从事件处理程序返回的错误信息。
1.2 与 IE 深度集成
IE 应用有很多特性将浏览器框架与内部运行的网页联系起来,如标题栏显示页面标题、状态栏显示页面构建进度、安全页面显示锁图标等。而 .NET 中的 WebBrowser 控件和其他互操作库可以让应用轻松访问这些信息。
1.2.1 应用设置
以下是一个集成了 IE 特性和导航信息到 UI 的应用示例:
public class BrowserIntegration : BrowserModelAccess
{
public BrowserIntegration() : base()
{
// Integrate UI with IE notifications
BuildInterfaceIntegration();
// Integrate with the NewWindow event
BuildWindowIntegration();
// Add menu and command features
BuildMenuAndCommands();
}
...
}
这个类的构造函数处理了三个主要的集成点:
1. 将应用的表单和 UI 与 WebBrowser 控件返回的数据和事件集成。
2. 使应用能够“内部”处理弹出窗口,而不是在外部浏览器中打开。
3. 创建一些基本的 UI 代码,演示如何使用包装形式的 IOleCommandTarget 命令执行来调用 IE 命令,如“另存为”和“打印”。
1.2.2 集成 WebBrowser 事件与 IE UI
Web 浏览器通常通过 UI 向用户传达请求过程的信息。WebBrowser 控件提供了丰富的信息,容器应用可以利用这些信息向用户传达相同的内容。
private void BuildInterfaceIntegration()
{
// Sink key events that convey progress information to
// page or object progress
Browser.DocumentComplete += Browser_DocumentComplete;
Browser.TitleChange += Browser_TitleChange;
Browser.StatusTextChange += Browser_StatusTextChange;
}
以下是这些事件的回调函数:
void Browser_DocumentComplete(object sender,
DWebBrowserEvents2_DocumentCompleteEvent e)
{
// Set the address box text to the current URL
AddressBox.Text = Browser.LocationURL;
}
void Browser_TitleChange(object sender,
DWebBrowserEvents2_TitleChangeEvent e)
{
// Set window title to the page title
this.Text = e.text + " - Custom WebBrowser";
}
void Browser_StatusTextChange(object sender,
DWebBrowserEvents2_StatusTextChangeEvent e)
{
// Change the status text to the text emitted by IE
BrowserStatusText.Text = e.text;
}
这些事件的作用如下:
-
DocumentComplete
事件在文档下载、导航和加载完成时触发,此时可以获取当前地址并显示在地址栏。
-
TitleChange
事件在主文档(或框架)的标题更改时触发,会将应用窗口的标题更改为包含当前页面的标题。
-
StatusTextChange
事件会将 IE 发出的状态文本数据应用到应用自己的状态栏。
1.2.3 模拟 IE 的窗口行为
默认情况下,弹出窗口或用户命令打开新窗口会使 WebBrowser 控件在其所有者应用之外启动该页面。我们可以通过以下方式处理:
private void BuildWindowIntegration()
{
// Sink the NewWindow2 event
Browser.NewWindow2 += Browser_NewWindow2;
}
void Browser_NewWindow2(object sender,
DWebBrowserEvents2_NewWindow2Event e)
{
// Create a new instance of this form
BrowserIntegration newBrowserForm;
newBrowserForm = new BrowserIntegration();
// Return the new WebBrowser control instance on the new application
// instance as the new client site
e.ppDisp = newBrowserForm.Browser.Application;
// Show the new window
newBrowserForm.Visible = true;
}
当弹出窗口或用户操作请求外部窗口时,会创建一个新的应用实例,并将新的 WebBrowser 控件实例应用到
e.ppDisp
,从而让 WebBrowser 导航新实例,而不是将导航请求发送到系统默认浏览器。
1.2.4 显示和执行 OLE 命令
IE 的很多功能以命令的形式暴露,可以针对 IE 的应用站点执行。WebBrowser 控件通过实现和包装
IOleCommandTarget
接口简化了使用 OLE 命令的过程。
以下是处理“打印”和“另存为”命令的代码:
// Declare new menu and button objects
public MenuStrip Menu;
public ToolStripMenuItem MenuFile;
...
public ToolStripItem PrintButton;
private void BuildMenuAndCommands()
{
// Add a Print button to the toolbar
PrintButton = CommandBar.Items.Add("Print");
...
PrintButton.Click += new System.EventHandler(PrintButton_Click);
// Create the File > Save As menu item
MenuFileSaveAs = new ToolStripMenuItem("Save As...");
MenuFileSaveAs.Click += MenuFileSaveAs_Click;
// Create the File menu and add children
MenuFile = new ToolStripMenuItem("&File");
MenuFile.Click += MenuFile_Click;
MenuFile.DropDownItems.Add(MenuFileSaveAs)
...
// Create a new main menu strip and add all the items to it
Menu = new MenuStrip();
Menu.Items.AddRange(new ToolStripItemCollection(
Menu, new ToolStripItem[] { MenuFile, ...}));
Menu.Dock = DockStyle.Top;
Controls.Add(Menu);
}
以下是按钮和菜单项的点击事件处理函数:
void PrintButton_Click(object sender, EventArgs e)
{
// Query the status of the Print command
SHDocVw.OLECMDF printQuery =
Browser.QueryStatusWB(SHDocVw.OLECMDID.OLECMDID_PRINT);
// If the command is enabled, display the Print dialog
if ((printQuery & SHDocVw.OLECMDF.OLECMDF_ENABLED) != 0)
Browser.ExecWB(
SHDocVw.OLECMDID.OLECMDID_PRINT,
SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_PROMPTUSER
);
}
void MenuFile_Click(object sender, EventArgs e)
{
// Query the status of the Save As command
SHDocVw.OLECMDF saveAsQuery =
Browser.QueryStatusWB(SHDocVw.OLECMDID.OLECMDID_SAVEAS);
// Enable the Save As menu item only
// if that command is currently available
MenuFileSaveAs.Enabled =
((saveAsQuery & SHDocVw.OLECMDF.OLECMDF_ENABLED) != 0);
}
void MenuFileSaveAs_Click(object sender, EventArgs e)
{
// Query the status of the Save As command
SHDocVw.OLECMDF saveAsQuery =
Browser.QueryStatusWB(SHDocVw.OLECMDID.OLECMDID_SAVEAS);
// Execute the Save As action and prompt the user
// with a Save As dialog
if ((saveAsQuery & SHDocVw.OLECMDF.OLECMDF_ENABLED) != 0)
Browser.ExecWB(
SHDocVw.OLECMDID.OLECMDID_SAVEAS,
SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_PROMPTUSER
);
}
在执行命令前,会先调用
QueryStatusWB()
方法查询命令是否可用,如果可用则调用
ExecWB()
方法执行命令。
1.3 总结
WebBrowser 控件为开发者提供了将应用与互联网连接的好方法。它表面上是一个简单的、可包装的 IE 实例,适用于各种应用,如基本浏览器窗口、信息亭、应用启动页面等。而 .NET 框架进一步简化了访问 IE 内部接口和事件的过程。
2. 利用托管 ActiveX 控件增强页面内容
2.1 认识 ActiveX 控件
ActiveX 控件是 OLE(对象链接与嵌入)对象,是实现了
IUnknown
接口的进程内 COM 服务器。这些控件将其功能暴露给 COM,宿主应用(如 IE)可以通过
QueryInterface
调用。
ActiveX 控件通常用于网页中,扩展传统标记、脚本和样式的功能。不过,实例化的 ActiveX 控件有很多限制,且随着 IE 版本的发布,限制数量不断增加。
2.2 在 .NET 中构建基本控件
2.2.1 设计公共接口
ActiveX 控件的主要作用是作为网页和桌面软件之间的网关。创建控件的第一步是定义“通信媒介”。以下是一个 C# 公共接口示例:
[Guid("439CE9A2-FAFF-4751-B4F7-5341AF09DBD7")]
public interface IAxSampleBasic
{
// Properties
string StringPropertyTest { get; set; }
int IntPropertyTest { get; set; }
// Functions
string StringFunctionTest();
void FunctionInputTest(string input);
}
2.2.2 实现接口
接下来是实现这个接口的类:
[ClassInterface(ClassInterfaceType.None)]
[Guid("D0E4F5FB-BAB5-45F6-9CF6-ACB1CCB526F1")]
public class AxSampleBasicControl : IAxSampleBasic
{
public string StringPropertyTest { get; set; }
public int IntPropertyTest { get; set; }
public string StringFunctionTest()
{
// Return a sample string
return "Test.";
}
public void FunctionInputTest(string input)
{
// Show the input string in a message box
MessageBox.Show(input);
}
}
这个类实现了接口中的属性和函数。不过,此时的 ActiveX 控件还不能在 IE 中加载,需要进行注册。
2.2.3 控件注册
ActiveX 控件必须在注册表的
HKEY_CLASSES_ROOT\CLSID
键中注册。以下是注册节点的基本架构:
HKEY_CLASSES_ROOT\
CLSID\
{GUID}\
InprocServer32\
(Required assemblies)
Control\
TypeLib\
(Default) = {GUID} (REG_SZ)
Version\
(Default) = {MajorVersion}.{MinorVersion} (REG_SZ)
以下是注册函数示例:
[ComRegisterFunction()]
public static void Register(Type type)
{
// Create the CLSID (GUID) key for
// this object in the Classes key
RegistryKey guidKey =
Registry.ClassesRoot.CreateSubKey(
@"CLSID\" + type.GUID.ToString("B"));
// Create the InprocServer32 key
guidKey.CreateSubKey("InprocServer32");
// Create the "control" subkey to inform loaders that this
// is an ActiveX control
guidKey.CreateSubKey("Control");
// Create "TypeLib" to specify the typelib GUID associated with the class
Guid typeLibGuid = Marshal.GetTypeLibGuidForAssembly(type.Assembly);
// Create the type library key and set the typelib GUID as
...
}
注册过程会将上述元数据层次结构写入注册表。与非托管 COM 控件不同,.NET 应用通常使用
RegAsm.exe
进行注册。
2.3 总结
通过使用 WebBrowser 控件和托管 ActiveX 控件,开发者可以开发出功能强大、安全且易于维护的应用。在使用 WebBrowser 控件时,可以实现与 IE 的深度集成,处理各种事件和执行命令;而在使用托管 ActiveX 控件时,可以增强网页的功能,同时避免一些传统 ActiveX 控件带来的安全问题。
以下是一个简单的流程图,展示了使用 WebBrowser 控件开发应用的主要步骤:
graph TD;
A[开始] --> B[处理脚本错误];
B --> C[与 IE 深度集成];
C --> C1[应用设置];
C --> C2[集成事件与 UI];
C --> C3[模拟窗口行为];
C --> C4[执行 OLE 命令];
C1 --> D[完成开发];
C2 --> D;
C3 --> D;
C4 --> D;
同时,使用托管 ActiveX 控件增强页面内容的步骤如下:
1. 认识 ActiveX 控件
2. 设计公共接口
3. 实现接口
4. 注册控件
通过这些步骤,开发者可以充分利用 WebBrowser 控件和托管 ActiveX 控件的优势,开发出优秀的应用。
3. 深入探讨 WebBrowser 控件与 ActiveX 控件的应用场景
3.1 WebBrowser 控件的多样化应用
WebBrowser 控件在不同类型的应用中都能发挥重要作用,以下是一些常见的应用场景:
3.1.1 基本浏览器窗口
可以使用 WebBrowser 控件快速搭建一个简单的浏览器窗口,用户可以在其中浏览网页。通过集成前面提到的各种事件处理和命令执行功能,能够实现地址栏显示当前 URL、标题栏显示页面标题、状态栏显示加载状态等基本浏览器功能。
3.1.2 信息亭应用
在信息亭场景中,WebBrowser 控件可以用于展示特定的网页内容,如景点介绍、产品展示等。通过模拟 IE 的窗口行为,确保所有的页面导航都在信息亭应用内部进行,避免打开外部浏览器,提高用户体验。
3.1.3 应用启动页面
许多应用在启动时会显示一个启动页面,展示应用的相关信息或广告。使用 WebBrowser 控件可以方便地加载 HTML 页面作为启动页面,并且可以通过执行 OLE 命令实现打印启动页面等功能。
3.2 托管 ActiveX 控件的优势与挑战
3.2.1 优势
- 安全性高 :与传统的 ActiveX 控件相比,托管 ActiveX 控件使用 .NET 开发,能够避免许多低级别安全问题。.NET 提供的抽象层使得开发者可以更专注于功能实现,而不用担心内存管理等安全隐患。
- 易于开发和维护 :.NET 语言(如 C#)具有更高的可读性和可维护性,开发者可以更轻松地设计和构建 ActiveX 控件。同时,.NET 框架提供了丰富的类库和工具,能够加快开发速度。
- 性能提升 :近年来,高级语言在性能方面有了显著提升,托管 ActiveX 控件在速度、响应性和应用占用空间等方面都有不错的表现。
3.2.2 挑战
- 兼容性问题 :虽然 ActiveX 控件在 IE 中得到广泛支持,但在其他浏览器中可能存在兼容性问题。开发者需要考虑如何在不同的浏览器环境中提供一致的用户体验。
- 安全限制 :随着浏览器安全机制的不断加强,ActiveX 控件的使用受到了更多的限制。开发者需要确保控件符合相关的安全标准,避免被浏览器阻止加载。
3.3 结合使用 WebBrowser 控件和托管 ActiveX 控件
在某些应用场景中,可以将 WebBrowser 控件和托管 ActiveX 控件结合使用,以实现更强大的功能。例如,在一个企业内部的信息管理系统中,可以使用 WebBrowser 控件作为主界面,加载网页内容;同时,使用托管 ActiveX 控件来实现一些特定的功能,如数据加密、文件上传等。
以下是一个简单的表格,对比了 WebBrowser 控件和托管 ActiveX 控件的特点:
| 控件类型 | 功能特点 | 应用场景 | 安全风险 |
| ---- | ---- | ---- | ---- |
| WebBrowser 控件 | 可与 IE 深度集成,处理各种事件和执行命令 | 基本浏览器、信息亭、应用启动页面等 | 相对较低,依赖于 IE 的安全机制 |
| 托管 ActiveX 控件 | 增强网页功能,提供特定的业务逻辑 | 网页扩展、企业应用等 | 相对较低,使用 .NET 开发可避免一些安全问题 |
4. 实际案例分析
4.1 企业内部信息管理系统
某企业开发了一个内部信息管理系统,使用 WebBrowser 控件作为主界面,用户可以在其中浏览各种业务相关的网页。通过集成 WebBrowser 控件的事件处理功能,实现了以下功能:
- 地址栏实时显示当前页面的 URL,方便用户查看和复制。
- 标题栏显示页面标题,提高用户对当前页面的辨识度。
- 状态栏显示页面加载进度和状态信息,让用户了解操作的执行情况。
同时,为了实现一些特定的业务功能,如数据加密和文件上传,开发团队使用了托管 ActiveX 控件。通过设计公共接口和实现相应的功能函数,确保了控件的功能完整性和安全性。在注册控件后,将其嵌入到网页中,用户可以在浏览网页的同时使用这些功能。
4.2 在线教育平台
一个在线教育平台使用 WebBrowser 控件来展示课程视频和教学资料。通过处理 WebBrowser 控件的
DocumentComplete
事件,在页面加载完成后自动播放课程视频。同时,为了实现学生与教师之间的实时互动,平台使用了托管 ActiveX 控件来实现视频通话和聊天功能。
在这个案例中,WebBrowser 控件和托管 ActiveX 控件的结合使用,为用户提供了一个完整的在线学习体验,既能够方便地浏览教学内容,又能够进行实时互动。
5. 总结与展望
5.1 总结
通过本文的介绍,我们了解了 WebBrowser 控件和托管 ActiveX 控件的基本概念、开发方法和应用场景。WebBrowser 控件为开发者提供了与 IE 深度集成的能力,能够处理各种事件和执行命令,适用于多种类型的应用。而托管 ActiveX 控件则可以增强网页的功能,同时提高安全性和可维护性。
5.2 展望
随着互联网技术的不断发展,WebBrowser 控件和托管 ActiveX 控件也将面临新的挑战和机遇。未来,我们可以期待以下方面的发展:
5.2.1 跨浏览器支持
目前,WebBrowser 控件和 ActiveX 控件主要在 IE 中得到支持,未来可能会有更多的技术和标准出现,使得这些控件能够在更多的浏览器中使用,提高应用的兼容性。
5.2.2 安全性进一步提升
随着安全威胁的不断增加,开发者将更加注重控件的安全性。未来可能会有更多的安全机制和技术被应用到 WebBrowser 控件和托管 ActiveX 控件中,确保用户数据的安全。
5.2.3 功能拓展
WebBrowser 控件和托管 ActiveX 控件的功能将不断拓展,例如支持更多的多媒体格式、提供更强大的数据分析功能等,为用户提供更丰富的体验。
以下是一个流程图,展示了结合使用 WebBrowser 控件和托管 ActiveX 控件开发应用的整体流程:
graph TD;
A[确定应用需求] --> B[选择使用 WebBrowser 控件];
B --> C[实现与 IE 集成和事件处理];
C --> D[确定是否需要特定功能];
D -- 是 --> E[开发托管 ActiveX 控件];
D -- 否 --> F[完成开发];
E --> F[完成开发];
通过充分利用 WebBrowser 控件和托管 ActiveX 控件的优势,开发者可以开发出功能强大、安全可靠的应用,满足不同用户的需求。在未来的开发过程中,我们需要不断关注技术的发展,及时调整开发策略,以适应不断变化的市场需求。
超级会员免费看
2714

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



