用mshtml获得Javascript中function的返回值

    今天琢磨了一下如何用mshtml获得Javascript中function的返回值。我们以前都是用没mshtml.IHTMLWindow2接口的execScript方法来执行HTML文档中的javascript代码段,如

 

//awbMain为AxSHDocVw.AxWebBrowser控件
mshtml.IHTMLDocument2 doc = this.awbMain.Document; 
private mshtml.IHTMLWindow2 win = doc.parentWindow;
string strScript = "alert('OK');";
win.execScript(strScript, 
"javascript");

 

    智能提示显示execScript方法的返回值类型是object,但是其实其返回值永远是null(当然,我们不应该相信COM的智能提示,很多参数、返回值等都是object类型,无法得到更详细的信息),即使该方法执行的是一个有返回值javascript函数。

    那么,这个问题如何解决呢?Google一下吧。简体中文的页面中没有这个问题的答案,看看英文的文档吧(这里说一句,很多人因为懒或者不会使用google等搜索引擎而错过了学习一些东西的机会。多用一下搜索引擎,考虑怎样使用关键词,并不断提高关键字的质量,相信很容易找到相应的资料)。输入“"javascript return value" +mshtml +c#”作为关键字,搜索结果只有一篇文档,要的就是它。这篇文档详细描述了如何在.NET应用程序中控制Internet Explorer,示例既有C#也有VB.NET,既有1.0也有2.0,非常棒(附在随笔的最后)。

    文档中给出了这个问题的解决方法,不过是.NET 2.0中的解决方法。.NET 2.0中的解决方法是利用HtmlDocument类的InvokeScript方法来实现:

 

string strRetVal = "";
//awbMain为System.Windows.Forms.WebBrowser控件
HtmlDocument doc = this.awbMain.Document;
//jsFunction为HTML文档中javascript函数的函数名
strRetVal = (string)doc.InvokeScript("jsFunction");
System.Windows.Forms.MessageBox.Show(strRetVal);

 

    要注意的是,HTML文档中的javascript函数名后要加空括号(没有参数的情况下),而在C# 2.0中调用之则不用加空括号。

    在C# 1.x中使用mshtml如何解决这个问题呢,这里介绍一个变通的方法(这些变通的方法在以前的随笔中也用到过):
        1、在Form中定义变量用于存储javascript函数的返回值;
        2、使用.NET 1.x中的InteropServices把应用程序的Form对象传入到HTML DOM中;
        3、在javascript函数中为1中的变量赋值(赋和javascript函数返回值一样的值),这样javascript函数甚至不需要有返回值了。

    步骤2的代码如下:

 

private System.Runtime.InteropServices.Expando.IExpando iex;
private mshtml.IHTMLDocument2 doc = null;
//awbMain为AxSHDocVw.AxWebBrowser控件,wendang加载完毕后执行的代码
private void awbMain_DocumentComplete(object sender, AxSHDocVw.DWebBrowserEvents2_DocumentCompleteEvent e)
{
 
this.doc = (mshtml.IHTMLDocument2)this.awbMain.Document;
 ex 
= (System.Runtime.InteropServices.Expando.IExpando)doc;
 System.Reflection.PropertyInfo piform 
= ex.AddProperty("MainForm");
 piform.SetValue(doc, 
thisnull);
}


 

    这样在步骤3的HTML文档的javascript函数中就可以用document.MainForm来指代Windows应用程序中的Form了。

 

转自:http://www.cnblogs.com/waxdoll/archive/2007/06/30/271018.html

posted @ 2009-03-06 01:19  怪_怪  阅读(1543)  评论(0编辑  收藏  举报