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

WinForms-如何从WebBrowser控件内部执行C#应用程序代码?,c#,winforms,webbrowser-control,C#,Winforms,Webbrowser Control,我有一个包含web浏览器控件的表单。此浏览器控件将从磁盘加载一些HTML并显示它。我希望能够在表单中的HTML access C#代码中有一个按钮 例如,HTML中的按钮可能会调用表单上的Close()方法 目标平台:C#和Windows窗体(任何版本)这是可能的,但我还没有在.NET中完成。 几年前,我有一个C++应用程序,它承载了一个Web浏览器控件(ActiveX)。通过控件中的HTML,可以调用ActiveX控件的“out”,并让它执行操作 虽然HTMLDOM/JavaScript不了解

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

例如,HTML中的按钮可能会调用表单上的Close()方法


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

这是可能的,但我还没有在.NET中完成。 几年前,我有一个C++应用程序,它承载了一个Web浏览器控件(ActiveX)。通过控件中的HTML,可以调用ActiveX控件的“out”,并让它执行操作

虽然HTMLDOM/JavaScript不了解C#,但在.NET中也应该可以这样做。但是,如果您将.NET功能包装在COM对象中,您应该能够调用COM/ActiveX对象上的方法,而这些方法又将调用您的C#代码


希望这有帮助。

您所要做的就是为WebBrowser的导航事件添加一个事件处理程序

在浏览器导航到下一页之前触发此事件。它允许您中断进程并执行任何您想要的操作,包括取消导航和调用代码

非常容易使用。我遇到的唯一警告是,您不能查看PostData--请参见我的问题:

下面是一些示例代码:

    private void MyMethod()
    {
        // do something
    }

    private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
    {
        MyMethod();
        e.Cancel = true;
    }
我在VB6中所做的:

看看酒店。使用此工具成功地让Google Maps与windows窗体应用程序对话。

我在过去的一些应用程序中实现了这一点,下面是如何实现的:(注意:下面的示例尚未准备好用于生产,应仅用作指南)

首先创建一个普通的.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);  
    }
}
接下来,在包含web浏览器控件的.NET表单中创建COMVisible类的实例,然后将web浏览器控件ObjectForScript设置为该实例:

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

         browserControl.ObjectForScripting = m_external; 
    }
最后,在web浏览器控件中运行的Javascript中,您可以通过window.external对象访问.NET方法。在这种情况下,window.external实际引用(通过COM互操作包装器间接引用)上面创建的“外部”对象:

// Javascript code
function CloseButton_Click()
{
    if (window.external)
    {
        window.external.CloseApplication();
    }
}
请注意,从Javascript到.NET的调用通过COM互操作层,因此必须查询默认接口、编组参数等。换句话说,它可能相对较慢,因此,如果您计划进行多个调用(例如从一个循环中进行多个调用),请执行一些性能测试

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

    browserControl.Document.InvokeScript("jScriptFunction", new object[] { "param1", 2, "param2" });

几年前我就这样做了,并在这里写了博客:

具体来说,您可以使用
Type.InvokeMember()
从C#调用JavaScript