【问题标题】:C# BHO return value from Javascript来自 Javascript 的 C# BHO 返回值
【发布时间】:2014-07-29 00:12:28
【问题描述】:

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

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

但是现在我需要将 JS 方法的值返回给我的 BHO。我实现了返回字符串的测试 JS 方法,但是当我使用 execScript 时没有返回任何内容。我开始阅读文档about execScript method,发现现在他们建议改用eval

但是我找不到任何关于如何从我的 C# BHO 调用它的信息。我找到了this question,甚至还有 c# 示例,但它假定我托管 WebBrowser 控件并建议使用 Document.InvokeScript。在 MSHTML 中,没有一个 IHTMLDocument* 接口具有 InvokeScript 方法。我错过了什么吗?

编辑 1: 这里是a question,它回答了如何从 execScript 获取返回值。但是如果 MSDN 说不再支持它,使用 execScript 可能并不明智。

编辑 2: 此问题的更多代码。首先我有一个这样的 JS 函数(在一个名为 func.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 为空。我看到该脚本已执行,并且我看到返回值不为空,因为我看到带有返回值的警报窗口。我想要的是我的 C# BHO 代码中这个 JS 函数的返回值。看起来这可以使用answer 来完成,但正如我所说的MSDN says I should use eval instead of execScript。问题是如何调用 eval 并从我的 JS 函数中获取返回值。

【问题讨论】:

  • 您的 2 行代码并没有提供太多可处理的信息。发布您的代码。
  • @L.B,我的整个 BHO 代码有点太复杂,无法发布,我可以稍后创建一个演示 BHO 项目,但关键是不再支持 IHTMLWIndow2.exec 脚本,无论如何也不支持正常工作。我在问是否有人有从 c# bho 调用“eval”的例子
  • 我可以发布一些代码,但我不确定你真正想要做什么。如果您不解释您真正想要做什么,我们将无能为力。阅读this 了解我的意思。
  • @L.B,有趣的链接 :) 添加了更多代码。
  • 你到底想在这里做什么?如果您告诉我们您想要完成的工作,也许我们可以为您提供更好的解决方案。

标签: c# javascript internet-explorer bho mshtml


【解决方案1】:

我找到了一些允许在 C++ BHO 中从 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.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-22
    相关资源
    最近更新 更多