C# 在C中从WebBrowser控件获取操作#

C# 在C中从WebBrowser控件获取操作#,c#,html,winforms,C#,Html,Winforms,是否可以这样做?例如,我有一个带有WebBrowser控件的表单和包含一些元素的本地HTML页面。当用户单击网页中的按钮时,表单会执行某些操作(例如,关闭应用程序)。是否有任何方法将DOM操作与表单事件连接起来,以及如何连接?是的,您可以使用该属性设置一个对象,该对象将作为窗口.external公开给JavaScript。然后,您可以在JavaScript中调用该对象上的方法。如果您需要首先向页面中注入一些JavaScript,以便将这些内容连接到未编写的HTML页面中,请查看WebBrowse

是否可以这样做?例如,我有一个带有WebBrowser控件的表单和包含一些元素的本地HTML页面。当用户单击网页中的按钮时,表单会执行某些操作(例如,关闭应用程序)。是否有任何方法将DOM操作与表单事件连接起来,以及如何连接?

是的,您可以使用该属性设置一个对象,该对象将作为
窗口.external
公开给JavaScript。然后,您可以在JavaScript中调用该对象上的方法。如果您需要首先向页面中注入一些JavaScript,以便将这些内容连接到未编写的HTML页面中,请查看
WebBrowser.DocumentCompleted
事件,在该事件中,您可以向
WebBrowser.Document
中注入JavaScript,如下所示:

private void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    try
    {
        mainDoc = webBrowser.Document;
        if (mainDoc != null)
        {
            HtmlElementCollection heads = mainDoc.GetElementsByTagName("head");
            HtmlElement scriptEl = mainDoc.CreateElement("script");
            IHTMLScriptElement el = (IHTMLScriptElement)scriptEl.DomElement;
            el.text = "alert('hello world')";
            heads[0].AppendChild(scriptEl);
        }
    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex.ToString());
    }
}
编辑:我忘了提到IHTMLScript元素来自COM,您在某些地方需要此代码:

[ComImport, ComVisible(true), Guid(@"3050f28b-98b5-11cf-bb82-00aa00bdce0b")]
[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)]
[TypeLibType(TypeLibTypeFlags.FDispatchable)]
public interface IHTMLScriptElement
{
    [DispId(1006)]
    string text { set; [return: MarshalAs(UnmanagedType.BStr)] get; }
}

是的,关于鼠标事件,例如,您可以在
webBrowser.Document.Body.MouseDown+=someFunc并使用
webBrowser.Document.GetElementFromPoint(e.ClientMousePosition)
获取单击的HTML元素,然后对其执行操作。有关详细信息,请参阅。