WinForms - 如何从WebBrowser控件中执行C#应用程序代码?

Bri*_*tle 4 c# webbrowser-control winforms

我有一个包含Web浏览器控件的表单.此浏览器控件将从磁盘加载一些HTML并显示它.我希望能够在我的表单中的HTML访问C#代码中有一个按钮.

例如,HTML中的按钮可能会调用窗体上的Close()方法.

目标平台:C#和Windows Forms(任何版本)

Ash*_*Ash 18

我在过去的一些应用程序中已经实现了这一点,具体如下:(注意:下面的示例不是生产就绪的,应该仅用作指南).

首先创建一个普通的.NET类(public),其中包含您希望从Web浏览器控件中运行的Javasvcipt调用的公共方法.

最重要的是,它必须使用System.Runtime.InteropServices命名空间中的ComVisible(true)]属性进行修饰(IE中的Javascript基于COM).它可以被称为任何东西,我称之为"外部"以使事情更清晰.

using System.Runtime.InteropServices;

[ComVisible(true)]
public class External
{
    private static MainWindow m_mainWindow = null;

    public External(MainWindow mainWindow)
    {
        m_mainWindow = mainWindow; 
    }

    public void CloseApplication()
    {
        m_mainWindow.Close();
    }


    public string CurrentDate(string format)
    {
        return DateTime.Now.ToString(format);  
    }
}
Run Code Online (Sandbox Code Playgroud)

接下来在包含Web浏览器控件的.NET表单中创建COMVisible类的实例,然后将Web浏览器控件ObjectForScripting设置为该实例:

    private void MainWindow_Load(object sender, EventArgs e)
    {
         m_external = new External(this);

         browserControl.ObjectForScripting = m_external; 
    }
Run Code Online (Sandbox Code Playgroud)

最后,在Web浏览器控件中运行的Javascript中,您可以通过window.external对象访问.NET方法.在这种情况下,window.external实际引用(间接通过COM interop包装器)上面创建的"External"对象:

// Javascript code
function CloseButton_Click()
{
    if (window.external)
    {
        window.external.CloseApplication();
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,从Javascript到.NET的调用将通过COM互操作层,因此必须进行查询默认接口,编组参数等.换句话说,它可能相对较慢,如果您打算例如从循环内进行多次调用,那么请进行一些性能测试.

此外,仅供将来参考,从.NET调用Javascript代码更简单,只需使用Document.InvokeScript方法:

    browserControl.Document.InvokeScript("jScriptFunction", new object[] { "param1", 2, "param2" });
Run Code Online (Sandbox Code Playgroud)


Dav*_*emp 9

查看WebBrowser.ObjectForScripting属性.管理以使用此方式让Google地图与Windows窗体应用程序通信.