.NET 2.0框架中的WebBrowser类应用

在.NET 2.0框架中,有一个非常强大的类叫做System.Windows.Forms.WebBrowser,它允许开发者在自己的应用程序中嵌入网页,并且能够与这些网页进行交互。这类似于微软的MSN Messenger Activity SDK,它允许开发者创建小应用程序,使得数据可以在不同的应用程序之间轻松传输。本文将探讨如何利用WebBrowser类来实现类似的功能,而不是讨论如何实现Messenger Activity SDK。

MSN Activity SDK的开发者是如何使得其他人能够创建像“井字棋”这样的有趣扩展的呢?他们允许开发者在VBScriptJavaScript之间选择。实际上,他们并没有明确地给选择权;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

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485