gpt4 book ai didi

C# BHO 从 Javascript 返回值

转载 作者:行者123 更新时间:2023-11-29 10:14:48 26 4
gpt4 key购买 nike

我有一个 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* 接口(interface)有 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 中,我将这个脚本注入(inject)到页面中,如下所示:

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 函数中获取返回值。

最佳答案

我找到了一些允许从 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.

关于C# BHO 从 Javascript 返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24614868/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com