Essayer de définir / obtenir une variable JavaScript dans un ActiveX WebBrowser à partir de C #

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

Question

Nous avons une application Windows qui contient un contrôle ActiveX WebBrowser. Dans le cadre du fonctionnement normal de cette application, des modifications sont apportées aux pages affichées par le contrôle ActiveX WebBrowser. Une partie de ces modifications implique la définition d'une variable JavaScript dans une page Web chargée dans ActiveX WebBrowser.

Nous devons initialiser cette variable dans C # (à l'origine, le code VB6 initialisait la valeur). La valeur de cette variable est un objet de classe visible par COM.

Cependant, pour des raisons de simplicité, nous avons réduit le problème à la définition d'une valeur de chaîne. Notre page d'origine implique des cadres et similaires, mais les mêmes problèmes se produisent dans une page comme celle-ci:

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

Nous voulons accéder à la variable champ et lui attribuer une valeur. En VB6, le code pour cela était assez simple:

doc.Script.field = 'newValue'

Cependant, en C #, nous avons dû recourir à d'autres astuces, comme ceci:

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

Le but de la page est de vérifier si notre variable a été correctement affectée par C #. En cliquant sur le bouton, vous obtiendrez la nouvelle valeur injectée par C #. Ainsi, par exemple, en cliquant sur le bouton de la page, une alerte indiquant: "newValue".

Cela fonctionne la première fois, mais pas si nous rechargeons la page. Lors des appels suivants, nous ne pouvons pas définir la valeur de la variable champ .

Quelqu'un a-t-il déjà pratiqué ce type d'opération?

Était-ce utile?

La solution 3

Ces deux articles nous ont aidés à trouver une solution à notre problème. Ils décrivent les bases de ce qu’il faut savoir:

Automatisation du navigateur Web Microsoft en utilisant C #

Utilisation d'interfaces d'hébergement avancées MSHTML

Nous avons donc implémenté une interface DocHostUIHandler et cela nous a permis de définir un UIHandler, nous permettant de référencer la méthode à partir de Javascript.

Autres conseils

Je pense que ce que vous recherchez est la méthode eval () en Javascript. Vous pouvez l’appeler de C # comme ceci:

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

Ce code évaluera "1 + 2" et renverra "3" . J'imagine que si vous deviez mettre en

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

vous obtiendriez cette variable affectée à 3 si elle est globalement visible dans le fichier.

Si vous utilisez le contrôle WebBrowser, vous pouvez affecter un objet c # au propriété objectForScripting http://msdn.microsoft.com/ en-us / library / system.windows.forms.webbrowser.objectforscripting.aspx

après cela, vous pouvez utiliser window.external dans votre javascript pour interagir avec votre objet c # à partir de javascript

si vous utilisez une version activeX pour une raison quelconque, vous pouvez transmettre javascript: urls pour définir votre variable par programme, ou vous pouvez synchroniser votre script à l'aide d'un service Web / base de données / fichier ou simplement en utilisant la méthode que vous avez suggérée.

La méthode habituelle consiste à ajouter une zone de saisie de texte masquée (la version du contrôle ASP.Net) sur la page. De cette façon, vous pouvez facilement définir sa valeur dans C # codebehind et lire la valeur dans JavaScript côté client (et inversement, bien sûr).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top