我们有一个包含ActiveX WebBrowser控件的Windows应用程序。作为此应用程序的常规操作的一部分,将对ActiveX WebBrowser控件显示的页面进行修改。部分修改涉及在加载到ActiveX WebBrowser中的网页中设置JavaScript变量。

我们需要在C#中初始化这个变量(最初,VB6代码正在初始化该值)。此变量的值是COM可见的类对象。

但是,为简单起见,我们将问题简化为设置字符串值。我们的原始页面涉及框架等,但在这样的页面中会出现同样的问题:

<HTML>
 <HEAD>
  <TITLE>Test</TITLE>
  <SCRIPT type="text/javascript">
   var field = 'hello world';
  </SCRIPT>
 </HEAD>
 <BODY>
   <input type="button" value="See field" onclick="javascript:alert(field);"/>
 </BODY>
</HTML>

我们想要访问字段变量并为其赋值。在VB6中,代码非常简单:

doc.Script.field = 'newValue'

然而,在C#中我们不得不求助于其他技巧,如下:

Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateSet(Script, null, "field",new object[] { "newValue"},null, null);

页面的要点是测试我们的变量是否由C#正确分配。单击该按钮应该产生C#注入的任何新值。例如,点击页面中的按钮,我们会收到一条警告:“newValue”。

这是第一次使用,但如果我们重新加载页面则不起作用。在后续调用中,我们无法设置变量 field 的值。

以前有没有人有过做这种操作的经验?

有帮助吗?

解决方案 3

这两篇文章帮助我们找到了解决问题的方法。他们概述了人们需要知道的基本知识:

使用C# Microsoft Web Browser Automation

使用MSHTML高级主机接口

所以我们实现了一个DocHostUIHandler接口,允许我们设置UIHandler,允许我们从Javascript引用该方法。

其他提示

我认为你要找的是Javascript中的 eval()方法。您可以像这样从C#调用它:

webBrowser1.Document.InvokeScript("eval", new String[] {"1 + 2"});

此代码将评估&quot; 1 + 2&quot; 并返回&quot; 3&quot; 。我想如果你要放入

InvokeScript("eval", new String[] {"varName = 3"})

如果文件中全局可见,则将该变量分配给3。

如果使用webBrowser控件,则可以为其指定c#对象 objectForScripting属性 http://msdn.microsoft.com/ EN-US /库/ system.windows.forms.webbrowser.objectforscripting.aspx

之后你可以使用javascript中的window.external与javascript中的c#对象进行交互

如果您出于某种原因使用activeX版本,则可以通过javascript:urls以编程方式设置变量,或者您可以使用webservice / database / file同步您的脚本,或者只使用您建议的方法。

我们使用的常用方法是在页面上添加隐藏文本输入框(ASP.Net控件版本)。这样,您可以轻松地在C#代码隐藏中设置其值,并在客户端JavaScript中读取值(当然,反之亦然)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top