Intentando establecer / obtener una variable de JavaScript en un ActiveX WebBrowser desde C #

StackOverflow https://stackoverflow.com/questions/136195

Pregunta

Tenemos una aplicación de Windows que contiene un control ActiveX WebBrowser. Como parte del funcionamiento regular de esta aplicación, se realizan modificaciones a las páginas que se muestran con el control ActiveX WebBrowser. Parte de estas modificaciones involucran la configuración de una variable de JavaScript en una página web que se carga en el ActiveB WebBrowser.

Necesitamos inicializar esta variable dentro de C # (originalmente, el código VB6 estaba inicializando el valor). El valor de esta variable es un objeto de clase visible para COM.

Sin embargo, para simplificar, hemos reducido el problema para establecer un valor de cadena. Nuestra página original incluye marcos y similares, pero los mismos problemas ocurren en una página como esta:

<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>

Queremos acceder a la variable field y asignarle un valor. En VB6 el código para esto fue bastante sencillo:

doc.Script.field = 'newValue'

Sin embargo, en C # hemos tenido que recurrir a otros trucos, como este:

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

El punto de la página es probar si nuestra variable fue asignada correctamente por C #. Al hacer clic en el botón debería aparecer cualquier valor nuevo que haya sido inyectado por C #. Por ejemplo, al hacer clic en el botón de la página, aparece una alerta que muestra: " newValue " ;.

Eso funciona la primera vez, pero no funciona si recargamos la página. En las llamadas subsiguientes no podemos establecer el valor del campo variable .

¿Alguien ha tenido alguna experiencia en este tipo de operación anteriormente?

¿Fue útil?

Solución 3

Estos dos artículos nos ayudaron a encontrar una solución a nuestro problema. Describen los conceptos básicos de lo que se necesita saber:

Automatización del navegador web de Microsoft usando C #

Uso de interfaces de host avanzadas MSHTML

Así que implementamos una interfaz DocHostUIHandler y eso nos permitió establecer un UIHandler, lo que nos permite hacer referencia al método desde Javascript.

Otros consejos

Creo que lo que está buscando es el método eval () en Javascript. Puedes llamarlo desde C # así:

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

Este código evaluará " 1 + 2 " y devolverá " 3 " . Me imagino que si lo pusieras

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

obtendría esa variable asignada a 3 si estuviera visible globalmente en el archivo.

Si usa el control webBrowser, puede asignar un objeto c # a la propiedad objectForScripting http://msdn.microsoft.com/ en-us / library / system.windows.forms.webbrowser.objectforscripting.aspx

después de eso, puedes usar window.external en tu javascript para interactuar con tu objeto c # desde javascript

si usa una versión de ActiveX por algún motivo, puede pasar javascript: urls para establecer su variable mediante programación, o puede sincronizar su script mediante un servicio web / base de datos / archivo o simplemente usando el método que sugirió.

El método habitual que usamos es agregar un cuadro de entrada de texto oculto (la versión de control de ASP.Net) en la página. De esa manera, puede establecer fácilmente su valor en el código C # y leer el valor en JavaScript del lado del cliente (y viceversa, por supuesto).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top