65.9K
CodeProject 正在变化。 阅读更多。
Home

将 WebBrowser 用作扩展可能性

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.70/5 (18投票s)

2006年9月24日

BSD

4分钟阅读

viewsIcon

89596

downloadIcon

972

使用简单的 WebBrowser 对象创建自己的扩展。

Screenshot - MyActivitySDK.jpg

引言

我们都见过 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 主要文章库。
© . All rights reserved.