WebBrower(.NET) 応用テクニック

JavaScriptからC#/VBのメソッドを実行する

WebBrowserで表示しているページ内のJavaScriptから、C#/VBのメソッドを実行します。

JavaScriptから呼び出されるメソッドを含むクラスに「<System.Runtime.InteropServices.ComVisible(True)>」属性を付与します。

//C#
[System.Runtime.InteropServices.ComVisible(true)]
public class JsTest
{
    ・・・

WebBrowser.ObjectForScriptingに上記クラスのオブジェクトを設定します。これでスクリプトからアクセスできるようになります。
//C#
private void Form1_Load(object sender, EventArgs e)
{
    webBrowser1.ScriptErrorsSuppressed = true;
    webBrowser1.ObjectForScripting = new JsTest();
}

もしFormクラスの中にWebBrowserオブジェクトと呼び出しメソッドを定義している場合、FormクラスにComVisible属性を付与して、ObjectForScriptingには自身のFormオブジェクトを設定しましょう。
webBrowser1.ObjectForScripting = this;

html側には、JavaScriptで呼び出し用のコードを記述します。
//JavaScript
window.external.メソッド名();
これでC#/VB側のメソッドが実行されます。引数も指定できます。
//JavaScript
window.external.メソッド名('引数1','引数2');

サンプル

実行してボタンを押すとテスト用ページ(https://web.biz-prog.net/test/testpage_wbevent.html)が表示されますので、 ページの中のボタンを押してください。C#/VBのメソッドが実行されます。

						Public Class Form1
							Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
						
								webBrowser1.ScriptErrorsSuppressed = True
								webBrowser1.ObjectForScripting = New JsTest()
						
							End Sub
						
							Private Sub btnOpen_Click(sender As Object, e As EventArgs) Handles btnOpen.Click
						
								webBrowser1.Navigate("https://web.biz-prog.net/test/testpage_wbevent.html")
						
							End Sub
						
						End Class
						
						<System.Runtime.InteropServices.ComVisible(True)>
						Public Class JsTest
						
							Public Sub JsTest1()
								MsgBox("Test1")
							End Sub
						
							Public Sub JsTest2(a As String, b As String)
								MsgBox("Test2:a=" & a & ",b=" & b)
							End Sub
						
						End Class
					
						public partial class Form1 : Form
						{
							public Form1()
							{
								InitializeComponent();
							}
					
							 private void Form1_Load(object sender, EventArgs e)
							{
								webBrowser1.ScriptErrorsSuppressed = true;
								webBrowser1.ObjectForScripting = new JsTest();
							}   
							
							
							private void btnOpen_Click(object sender, EventArgs e)
							{
								webBrowser1.Navigate("https://web.biz-prog.net/test/testpage_wbevent.html");
							}
						}
					
						[System.Runtime.InteropServices.ComVisible(true)]
						public class JsTest
						{
							public void JsTest1()
							{
								MessageBox.Show("Test1");
							}
					
							public void JsTest2(string a, string b)
							{
								MessageBox.Show("Test2:a=" + a + ",b=" + b);
							}
						}
					

参考