C#からActiveX WebBrowserでJavaScript変数を設定/取得しようとしています

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

質問

ActiveX WebBrowserコントロールを含むWindowsアプリケーションがあります。このアプリケーションの通常の操作の一部として、ActiveX WebBrowserコントロールによって表示されるページに変更が加えられます。これらの変更の一部には、ActiveX WebBrowserにロードされるWebページの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>

field 変数にアクセスして、値を割り当てます。 VB6では、このコードは非常に簡単でした:

doc.Script.field = 'newValue'

ただし、C#では、次のような他のトリックに頼らなければなりませんでした:

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

ページのポイントは、変数がC#によって適切に割り当てられたかどうかをテストすることです。ボタンをクリックすると、C#によって注入された新しい値が生成されます。たとえば、ページ内のボタンをクリックすると、「newValue」というアラートが表示されます。

これは初めて機能しますが、ページをリロードすると機能しません。後続の呼び出しでは、変数 field の値を設定できません。

以前にこの種の操作を行った経験はありますか?

役に立ちましたか?

解決 3

これら2つの記事は、問題の解決策を見つけるのに役立ちました。彼らは知っておくべきことの基本を概説します:

C#を使用したMicrosoft Web Browser Automation

MSHTML Advanced Hosting Interfacesの使用

したがって、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 / library / 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