在.NET 2.0框架中,有一个非常强大的类叫做System.Windows.Forms.WebBrowser
,它允许开发者在自己的应用程序中嵌入网页,并且能够与这些网页进行交互。这类似于微软的MSN Messenger Activity SDK,它允许开发者创建小应用程序,使得数据可以在不同的应用程序之间轻松传输。本文将探讨如何利用WebBrowser
类来实现类似的功能,而不是讨论如何实现Messenger Activity SDK。
MSN Activity SDK的开发者是如何使得其他人能够创建像“井字棋”这样的有趣扩展的呢?他们允许开发者在VBScript和JavaScript之间选择。实际上,他们并没有明确地给选择权;Internet Explorer为提供了脚本语言的选择。个人更喜欢JavaScript作为脚本语言,所以将展示这个小例子。
JavaScript有一个特殊的命名空间叫做window.external
。这个命名空间可以通过其他应用程序进行扩展,或者用一种永远无法理解的方式表达,“window.external
是为宿主访问提供的内置DOM对象”。MSN Messenger使用这个可扩展的空间,为其他开发者提供了一种方式,让他们能够创建能够与宿主应用程序通信的优秀Web应用程序。这与WebBrowser
类能够调用加载页面的任何方法相结合,可以为开发者提供一种强大的方式,让他们可以创建扩展,而不会有任何危险的安全威胁。应用程序不会因此而受到损害,因为外界没有办法进入。同时,拥有全部的权力来决定提供更多或更少的方法和属性。
在演示中,尽量保持代码的简洁。希望能够理解一切。现在,让展示一些金子。首先,需要一个带有WebBrowser
的表单,当然,还需要一个网页来查看。假设可以处理带有WebBrowser
的表单和基本HTML页面的创建。那么,想要做什么呢?
让从在宿主应用程序中从网页调用一个方法开始:
private void myCallAMethodButton_Click(object sender, EventArgs e)
{
// 可以从加载的页面调用任何方法...
// 将这个调用放在一个try-catch中,因为它会
// 在没有页面加载时创建一个异常...
try
{
// 如果调用一个方法,可以使用一个对象数组来
// 提供参数。方法只有一个参数,
// 所以在数组中给出一个对象。
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
到表单中的WebBrowser
对象:
public MainForm()
{
InitializeComponent();
// 这就是它,应用程序中最重要的事情!:-)
myWebBrowser.ObjectForScripting = new WindowExternal();
}
可以将任何对象分配给ObjectForScripting
属性,甚至是正在工作的表单,只要对象是ComVisible
!