c# BHO从Javascript返回值

本文关键字:返回值 Javascript BHO | 更新日期: 2023-09-27 18:11:42

我有一个c# BHO,它在文档中调用一些JS函数。通常我是这样做的(一切都很好):

IHTMLWindow2 wnd;
//...
wnd.execScript("testMethod('"testData'");");

但是现在我需要从JS方法返回值到我的BHO。我实现了测试JS方法,它返回一个字符串,但当我使用execScript时,没有返回任何东西。我开始阅读关于execScript方法的文档,发现现在他们建议使用eval代替。

但是我找不到任何关于如何从我的c# BHO调用它的信息。我发现了这个问题,甚至有c#的例子,但它假设我托管WebBrowser控件,并建议使用Document.InvokeScript。在MSHTML中没有IHTMLDocument*接口有InvokeScript方法。我错过什么了吗?

EDIT 1:这是一个问题,哪种类型的答案如何从execScript获得返回值。但是,如果MSDN说不再支持execScript,那么使用它可能不明智。

编辑2:更多关于这个问题的代码。首先,我有一个这样的JS函数(在一个名为funcs . JS的文件中):

getElemHtml = function () {
    var myElem = document.getElementsByClassName("lineDiv")[0];
    // A lot more code goes here...
    alert(myElem.innerHTML);
    return myElem.innerHTML;
}

然后在我的BHO中,我像这样将这个脚本注入到页面中:

StreamReader reader = new StreamReader(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("func.js"));
string scriptContent = reader.ReadToEnd();
IHTMLElement head = (IHTMLElement)((IHTMLElementCollection)ihtmlDoc2.all.tags("head")).item(null, 0);
IHTMLScriptElement scriptObject = (IHTMLScriptElement)htmlDoc2.createElement("script");
scriptObject.type = @"text/javascript";
scriptObject.text = scriptContent;
((HTMLHeadElement)head).appendChild((IHTMLDOMNode)scriptObject);

然后在BHO的另一部分,我想从getElemHtml()获得返回值:

var retVal = ihtmlWindow2.execScript("getElemHtml();");

但retVal为空。我看到脚本被执行,我看到返回值不为空,因为我看到带有返回值的警告窗口。我想要的是一个返回值从这个JS函数在我的c# BHO代码。看起来这可以用这个答案来完成,但正如我所说的MSDN说我应该使用eval而不是execScript。问题是如何调用eval并从我的JS函数中获得返回值。

c# BHO从Javascript返回值

我发现了一些链接,允许在c++ BHOs中从JS获得返回值,但我没有设法在c#中转换它们,所以这里是一个适合我的变通方法:

// Execute method and save return value to a new document property.
ieHtmlWindow2.execScript("document.NewPropForResponse = getElemHtml();");
// Read document property.
var property = ((IExpando)ieHtmlDocument2).GetProperty("NewPropForResponse", BindingFlags.Default);
if (property != null)
    return property.GetValue(ieHtmlDocument2, null);  // returns return value from getElemHtml.