C#からActiveX WebBrowserでJavaScript変数を設定/取得しようとしています
-
02-07-2019 - |
質問
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で値を読み取ることができます(もちろんその逆も可能です)。