次の方法で共有


方法: DHTML コードとクライアント アプリケーション コード間の Two-Way 通信を実装する

WebBrowser コントロールを使用して、既存の動的 HTML (DHTML) Web アプリケーション コードを Windows フォーム クライアント アプリケーションに追加できます。 これは、DHTML ベースのコントロールの作成に多大な開発時間を費やしていて、既存のコードを書き直すことなく Windows フォームの豊富なユーザー インターフェイス機能を利用したい場合に便利です。

WebBrowser コントロールを使用すると、ObjectForScripting プロパティと Document プロパティを使用して、クライアント アプリケーション コードと Web ページ スクリプト コード間の双方向通信を実装できます。 さらに、Web コントロールがアプリケーション フォーム上の他のコントロールとシームレスにブレンドされ、DHTML 実装を非表示にするように、WebBrowser コントロールを構成できます。 コントロールをシームレスにブレンドするには、表示されるページの背景色と表示スタイルがフォームの残りの部分と一致するように書式設定し、AllowWebBrowserDropIsWebBrowserContextMenuEnabled、および WebBrowserShortcutsEnabled プロパティを使用して標準のブラウザー機能を無効にします。

Windows フォーム アプリケーションに DHTML を埋め込むには

  1. WebBrowser コントロールの AllowWebBrowserDrop プロパティを false に設定して、WebBrowser コントロールがドロップされたファイルを開くのを防ぎます。

    webBrowser1.AllowWebBrowserDrop = false;
    
    webBrowser1.AllowWebBrowserDrop = False
    
  2. コントロールの IsWebBrowserContextMenuEnabled プロパティを false に設定すると、ユーザーが右クリックしたときに WebBrowser コントロールにショートカット メニューが表示されなくなります。

    webBrowser1.IsWebBrowserContextMenuEnabled = false;
    
    webBrowser1.IsWebBrowserContextMenuEnabled = False
    
  3. WebBrowser コントロールがショートカット キーに応答しないように、コントロールの WebBrowserShortcutsEnabled プロパティを false に設定します。

    webBrowser1.WebBrowserShortcutsEnabled = false;
    
    webBrowser1.WebBrowserShortcutsEnabled = False
    
  4. フォームのコンストラクターで ObjectForScripting プロパティを設定するか、OnLoad メソッドをオーバーライドします。

    次のコードでは、スクリプト オブジェクトにフォーム クラス自体を使用します。

    webBrowser1.ObjectForScripting = new MyScriptObject(this);
    
    webBrowser1.ObjectForScripting = New MyScriptObject(Me)
    
  5. スクリプト オブジェクトを実装します。

    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
    
  6. スクリプト コードで window.external オブジェクトを使用して、指定したオブジェクトのパブリック プロパティとメソッドにアクセスします。

    次の HTML コードは、ボタン クリックからスクリプト オブジェクトのメソッドを呼び出す方法を示しています。 このコードを、コントロールの Navigate メソッドを使用して読み込む HTML ドキュメントの BODY 要素にコピーするか、コントロールの DocumentText プロパティに割り当てます。

    <button onclick="window.external.Test('called from script code')">
        call client code from script code
    </button>
    
  7. アプリケーション コードで使用する関数をスクリプト コードに実装します。

    次の HTML SCRIPT 要素は、関数の例を提供します。 このコードを、コントロールの Navigate メソッドを使用して読み込む HTML ドキュメントの HEAD 要素にコピーするか、コントロールの DocumentText プロパティに割り当てます。

    <script>
    function test(message) {
        alert(message);
    }
    </script>
    
  8. Document プロパティを使用して、クライアント アプリケーション コードからスクリプト コードにアクセスします。

    たとえば、次のコードをイベント ハンドラー Click ボタンに追加します。

    webBrowser1.Document.InvokeScript("test",
        new String[] { "called from client code" });
    
    webBrowser1.Document.InvokeScript("test", _
        New String() {"called from client code"})
    
  9. 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 アセンブリへの参照。

関連項目