ドキュメント内でスクリプトを動かすだけならば、HTMLにスクリプトを埋め込む方法と同様です。
HtmlElement element = webBrowser.Document.CreateElement("p");
element.InnerHtml = "<button onclick='window.alert(\"OK\")'>Click</button>";
アプリケーションと連携するには、まずWebページとして動作しないように設定を修正します。
| コード | 目的 |
|---|---|
| AllowWebBrowserDrop = false | WebBrowserへドロップされたファイルを開かないようにする。 |
| IsWebBrowserContextMenuEnabled = false | コンテキストメニューを表示しないようにする。 |
| WebBrowserShortcutsEnabled = false | ショートカットキーに応答しないようにする。
falseとするとWebBrowserへのキー入力は破棄され、キーによっては他のコントロールへも伝播しなくなります。 |
ドキュメント内のスクリプトから、C#のメソッドを呼び出す方法を考えます。
次のコードではフォームにwebBrowserが表示されているとして、そこに表示されたbutton要素をクリックしたときにFunc()が呼び出されるサンプルです。
[System.Runtime.InteropServices.ComVisible(true)]
public class Form1 : Form
{
public Form1()
{
webBrowser.ObjectForScripting = this;
webBrowser.DocumentText
= "<BUTTON onclick=\"window.external.Func('ABC')\">Click</BUTTON>";
}
public void Func(string message)
{
Console.Write(message);
}
}
呼び出すメソッドが定義されたクラスにはComVisible属性を設定し、そのオブジェクトをObjectForScriptingプロパティに設定します。そしてメソッドは、window.externalオブジェクトを介して呼び出します。WebBrowser.ObjectForScripting プロパティ (System.Windows.Forms) | MSDN
HtmlElement.AttachEventHandler()のハンドラにC#のメソッドを登録することで、それを呼び出せます。
C#からは、InvokeScript()によりドキュメント内のスクリプトを呼び出せます。
public object InvokeScript(
string scriptName,
object[] args
)
HtmlDocument.InvokeScript メソッド (String, Object[]) (System.Windows.Forms) | MSDN
webBrowser.DocumentCompleted += delegate
{
webBrowser.Document.InvokeScript("Func"); // NaN
webBrowser.Document.InvokeScript("Func", new Object[] { 2, 3 }); // 5
webBrowser.Document.InvokeScript("Func", new Object[] { "A", 3 }); // A3
};
webBrowser.DocumentText = "<HTML><SCRIPT>function Func(a, b){window.alert(a + b);}</SCRIPT></HTML>";