WebBrowser コントロールを使用して、既存の動的 HTML (DHTML) Web アプリケーション コードを Windows フォーム クライアント アプリケーションに追加できます。 これは、DHTML ベースのコントロールの作成に多大な開発時間を費やしていて、既存のコードを書き直すことなく Windows フォームの豊富なユーザー インターフェイス機能を利用したい場合に便利です。
WebBrowser コントロールを使用すると、ObjectForScripting プロパティと Document プロパティを使用して、クライアント アプリケーション コードと Web ページ スクリプト コード間の双方向通信を実装できます。 さらに、Web コントロールがアプリケーション フォーム上の他のコントロールとシームレスにブレンドされ、DHTML 実装を非表示にするように、WebBrowser コントロールを構成できます。 コントロールをシームレスにブレンドするには、表示されるページの背景色と表示スタイルがフォームの残りの部分と一致するように書式設定し、AllowWebBrowserDrop、IsWebBrowserContextMenuEnabled、および WebBrowserShortcutsEnabled プロパティを使用して標準のブラウザー機能を無効にします。
Windows フォーム アプリケーションに DHTML を埋め込むには
WebBrowser コントロールの AllowWebBrowserDrop プロパティを
false
に設定して、WebBrowser コントロールがドロップされたファイルを開くのを防ぎます。webBrowser1.AllowWebBrowserDrop = false;
webBrowser1.AllowWebBrowserDrop = False
コントロールの IsWebBrowserContextMenuEnabled プロパティを
false
に設定すると、ユーザーが右クリックしたときに WebBrowser コントロールにショートカット メニューが表示されなくなります。webBrowser1.IsWebBrowserContextMenuEnabled = false;
webBrowser1.IsWebBrowserContextMenuEnabled = False
WebBrowser コントロールがショートカット キーに応答しないように、コントロールの WebBrowserShortcutsEnabled プロパティを
false
に設定します。webBrowser1.WebBrowserShortcutsEnabled = false;
webBrowser1.WebBrowserShortcutsEnabled = False
フォームのコンストラクターで ObjectForScripting プロパティを設定するか、OnLoad メソッドをオーバーライドします。
次のコードでは、スクリプト オブジェクトにフォーム クラス自体を使用します。
webBrowser1.ObjectForScripting = new MyScriptObject(this);
webBrowser1.ObjectForScripting = New MyScriptObject(Me)
スクリプト オブジェクトを実装します。
public class MyScriptObject { private Form1 _form; public MyScriptObject(Form1 form) { _form = form; } public void Test(string message) { MessageBox.Show(message, "client code"); } }
Public Class MyScriptObject Private _form As Form1 Public Sub New(ByVal form As Form1) _form = form End Sub Public Sub Test(ByVal message As String) MessageBox.Show(message, "client code") End Sub End Class
スクリプト コードで
window.external
オブジェクトを使用して、指定したオブジェクトのパブリック プロパティとメソッドにアクセスします。次の HTML コードは、ボタン クリックからスクリプト オブジェクトのメソッドを呼び出す方法を示しています。 このコードを、コントロールの Navigate メソッドを使用して読み込む HTML ドキュメントの BODY 要素にコピーするか、コントロールの DocumentText プロパティに割り当てます。
<button onclick="window.external.Test('called from script code')"> call client code from script code </button>
アプリケーション コードで使用する関数をスクリプト コードに実装します。
次の HTML SCRIPT 要素は、関数の例を提供します。 このコードを、コントロールの Navigate メソッドを使用して読み込む HTML ドキュメントの HEAD 要素にコピーするか、コントロールの DocumentText プロパティに割り当てます。
<script> function test(message) { alert(message); } </script>
Document プロパティを使用して、クライアント アプリケーション コードからスクリプト コードにアクセスします。
たとえば、次のコードをイベント ハンドラー Click ボタンに追加します。
webBrowser1.Document.InvokeScript("test", new String[] { "called from client code" });
webBrowser1.Document.InvokeScript("test", _ New String() {"called from client code"})
DHTML のデバッグが完了したら、WebBrowser コントロールにスクリプト コードの問題のエラー メッセージが表示されないように、コントロールの ScriptErrorsSuppressed プロパティを
true
に設定します。// Uncomment the following line when you are finished debugging. //webBrowser1.ScriptErrorsSuppressed = true;
' Uncomment the following line when you are finished debugging. 'webBrowser1.ScriptErrorsSuppressed = True
例
次の完全なコード例では、この機能を理解するために使用できるデモンストレーション アプリケーションを示します。 HTML コードは、別の HTML ファイルから読み込まれるのではなく、DocumentText プロパティを使用して WebBrowser コントロールに読み込まれます。
using System;
using System.Windows.Forms;
public class Form1 : Form
{
private WebBrowser webBrowser1 = new WebBrowser();
private Button button1 = new Button();
[STAThread]
public static void Main()
{
Application.EnableVisualStyles();
Application.Run(new Form1());
}
public Form1()
{
button1.Text = "call script code from client code";
button1.Dock = DockStyle.Top;
button1.Click += new EventHandler(button1_Click);
webBrowser1.Dock = DockStyle.Fill;
Controls.Add(webBrowser1);
Controls.Add(button1);
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
webBrowser1.AllowWebBrowserDrop = false;
webBrowser1.IsWebBrowserContextMenuEnabled = false;
webBrowser1.WebBrowserShortcutsEnabled = false;
webBrowser1.ObjectForScripting = new MyScriptObject(this);
// Uncomment the following line when you are finished debugging.
//webBrowser1.ScriptErrorsSuppressed = true;
webBrowser1.DocumentText =
"<html><head><script>" +
"function test(message) { alert(message); }" +
"</script></head><body><button " +
"onclick=\"window.external.Test('called from script code')\">" +
"call client code from script code</button>" +
"</body></html>";
}
private void button1_Click(object sender, EventArgs e)
{
webBrowser1.Document.InvokeScript("test",
new String[] { "called from client code" });
}
}
public class MyScriptObject
{
private Form1 _form;
public MyScriptObject(Form1 form)
{
_form = form;
}
public void Test(string message)
{
MessageBox.Show(message, "client code");
}
}
Imports System.Windows.Forms
Public Class Form1
Inherits Form
Private webBrowser1 As New WebBrowser()
Private WithEvents button1 As New Button()
<STAThread()> _
Public Shared Sub Main()
Application.EnableVisualStyles()
Application.Run(New Form1())
End Sub
Public Sub New()
button1.Text = "call script code from client code"
button1.Dock = DockStyle.Top
webBrowser1.Dock = DockStyle.Fill
Controls.Add(webBrowser1)
Controls.Add(button1)
End Sub
Protected Overrides Sub OnLoad(e As EventArgs)
MyBase.OnLoad(e)
webBrowser1.AllowWebBrowserDrop = False
webBrowser1.IsWebBrowserContextMenuEnabled = False
webBrowser1.WebBrowserShortcutsEnabled = False
webBrowser1.ObjectForScripting = New MyScriptObject(Me)
' Uncomment the following line when you are finished debugging.
'webBrowser1.ScriptErrorsSuppressed = True
webBrowser1.DocumentText = _
"<html><head><script>" & _
"function test(message) { alert(message); }" & _
"</script></head><body><button " & _
"onclick=""window.external.Test('called from script code')"" > " & _
"call client code from script code</button>" & _
"</body></html>"
End Sub
Private Sub button1_Click(ByVal sender As Object, ByVal e As EventArgs) _
Handles button1.Click
webBrowser1.Document.InvokeScript("test", _
New String() {"called from client code"})
End Sub
End Class
Public Class MyScriptObject
Private _form As Form1
Public Sub New(ByVal form As Form1)
_form = form
End Sub
Public Sub Test(ByVal message As String)
MessageBox.Show(message, "client code")
End Sub
End Class
コードのコンパイル
このコードには次のものが必要です。
- System および System.Windows.Forms アセンブリへの参照。
関連項目
.NET Desktop feedback