将 WebBrowser 用作扩展可能性
使用简单的 WebBrowser 对象创建自己的扩展。
引言
我们都见过 Microsoft MSN Messenger Activity SDK 的那些很棒的小功能(嗯,我见过 ;-)。MSN 为我们提供了 SDK,messengeractivitySDK.zip。有了这个 SDK,开发者就可以创建小应用程序。现在,数据可以很容易地从一个应用程序发送到另一个应用程序。我在 Code Project 上看到了一个很好的例子。然而,这篇文章不是关于 Messenger Activity SDK 的实现。相反,它讨论了如何利用 .NET 2.0 Framework 中的 System.Windows.Forms.WebBrowser
类,以便您可以创建自己的类似 SDK。
背景
那么,MSN Activity SDK 开发者是如何让其他人创建像他们作为例子的那个有趣的“井字棋”游戏那样的出色扩展的呢?他们让开发者可以在 VBScript 和 JavaScript 之间进行选择。实际上,他们没有明确地给你选择;Internet Explorer 让你选择脚本语言。我个人更喜欢 JavaScript 作为脚本语言,因此我将在 JavaScript 中展示这个小例子。
JavaScript 有一个特殊的命名空间,称为 window.external
。这个命名空间可以被其他应用程序扩展,或者,用我永远无法理解的方式表达,“window.external 是一个为宿主访问提供的内置 DOM 对象。” MSN Messenger 使用这个可扩展的空间为其他开发者提供了一种制作优秀的 Web 应用程序的方法,这些应用程序可以与托管应用程序通信。这与 WebBrowser
类能够调用来自已加载页面的任何方法相结合,可以为您提供一种强大的方式,让开发者制作扩展,而没有任何危险的安全威胁。您的应用程序无法以这种方式被破坏,因为外界无法进入。同时,您可以完全控制让更多或更少的方法和属性可用。
使用代码
在演示中,我试图使代码尽可能干净。我希望你能理解一切。不过,现在说得够多了。让我们向你展示一些金子。 ;-)
首先,您需要一个带有 WebBrowser
的表单,当然,还需要一个网页来查看。我假设您可以处理带有 WebBrowser
的表单的创建以及基本的 HTML 页面。那么,我们想做什么呢?
- 我们希望从网页调用一个方法。
- 我们希望从托管应用程序调用一个方法。
- 我们希望从托管应用程序获取一个字符串。
- 我们希望从网页设置托管应用程序中的一个字符串。
让我们从在托管应用程序中调用网页中的方法开始
private void myCallAMethodButton_Click(object sender, EventArgs e)
{
// You can call any method from the page you loaded...
// I have enclosed this call in a try-catch, because it will
// create a exception when there isn't a page loaded ...
try
{
// If you call a method, you can use a object array to
// supply parameters. My method only has 1 parameter,
// so I give 1 object in the array.
myWebBrowser.Document.InvokeScript("InvokeMethod",
new object[] { "Wow, impressive !" });
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}
顺便说一句,您应该检查 Document
属性。它包含很多有价值的方法和其他好东西。让我们继续,趁我们还有热情!首先,让我们调用一个不在 HTML 页面中的应用程序中的方法。要调用托管应用程序中的方法,您需要将类暴露给 COM。不要问我为什么,就是这样。
[System.Runtime.InteropServices.ComVisible (true)]
public class WindowExternal
{ }
此类中的任何方法或属性都将通过 window.external
对象暴露给脚本。要查看类的成员,您应该下载源代码。在这个类中没有什么可看的,你已经知道的。现在,让我们将我们刚刚创建的类 WindowExternal
应用于 Form 中的 WebBrowser
对象
public MainForm()
{
InitializeComponent();
// This is it, THE MOST IMPORTANT THING IN YOUR APPLICATION ! :-)
myWebBrowser.ObjectForScripting = new WindowExternal();
}
您可以将任何对象分配给 ObjectForScripting
属性,即使是您正在使用的表单,只要该对象是 ComVisible
!
关注点
人们只是不知道 JavaScript 具有的力量。只需学习这门语言,你就可以用 C# 或 Delphi 做任何你想做的事情。现在是我这篇小文章的结尾了;我希望你喜欢阅读它。
历史
- 2006 年 9 月 24 日 -- 这是我文章的第一个版本,也是我在 CodeProject 上的第一篇文章,所以还没有真正的历史。但你可以肯定会有后续报道的!
- 2006 年 12 月 10 日 -- 文章已更新。
- 2007 年 6 月 22 日 -- 文章已编辑并移至 CodeProject.com 主要文章库。