Web 浏览器控件:如何捕获文档事件?

IT技术 c# javascript wpf
2021-03-18 14:12:35

我正在使用 WPF 的 WebBrowser 控件加载一个简单的网页。在此页面上,我有一个锚点或按钮。我想在我的应用程序后面的代码中(即在 C# 中)捕获该按钮的点击事件。

WebBrowser 控件有没有办法捕获已加载页面元素上的单击事件?

另外,是否可以在页面和 WebBrowser 之间传递事件触发的数据?以上所有应该都是可能的,对吗?

  • 编辑:可能的解决方案:

我发现以下链接可能是一个解决方案。我还没有测试过,但值得一试。将根据我的测试结果更新此问题。

http://support.microsoft.com/kb/312777

2个回答

好的答案找到了 - 经过测试并且有效:

  • 从 COM 选项卡添加一个名为:Microsoft HTML 对象库的引用

下面是一个示例代码:

您将需要两个组件:WebBrowser (webBrowser1) 和一个 TextBox (textBox1)

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        webBrowser1.LoadCompleted += new LoadCompletedEventHandler(webBrowser1_LoadCompleted);
    }

    private void webBrowser1_LoadCompleted(object sender, NavigationEventArgs e)
    {
        mshtml.HTMLDocument doc;
        doc = (mshtml.HTMLDocument)webBrowser1.Document;
        mshtml.HTMLDocumentEvents2_Event iEvent;
        iEvent = (mshtml.HTMLDocumentEvents2_Event)doc;
        iEvent.onclick += new mshtml.HTMLDocumentEvents2_onclickEventHandler(ClickEventHandler);
    }

    private bool ClickEventHandler(mshtml.IHTMLEventObj e)
    {
        textBox1.Text = "Item Clicked";
        return true;
    }
}
由于没有给出其他答案,我将选择此作为答案。虽然我找到了更好的方法来解决这个问题。该方法在codegain.com/articles/wpf/ieprogramming/... 中有描述,它使用一个名为 ObjectForScriptingHelper 的类。非常容易实现,而且效果很好。
2021-04-25 14:12:35
它似乎只有 20% 的时间对我来说有效,大多数情况下它无法调用“ClickEventHandler”,即使 LoadCompleted 方法完全完成,我可以看到没有任何异常......有什么想法吗?我在这里发布了它:stackoverflow.com/questions/35058874/...
2021-05-07 14:12:35
@Bassem 引用的代码增益文章现在可以在这里找到:dotnetfunda.com/articles/show/840/...
2021-05-20 14:12:35

这是另一个例子。

我试图注入一个远程 javascript 文件,并在准备就绪时通过向<script src="{path to remote file}" />标头添加 DOM 元素执行一些代码,这与jQuery.getScript(url, callback) 的想法基本相同

下面的代码工作正常。

HtmlElementCollection head = browser.Document.GetElementsByTagName("head");
if (head != null)
{
    HtmlElement scriptEl = browser.Document.CreateElement("script");
    IHTMLScriptElement element = (IHTMLScriptElement)scriptEl.DomElement;
    element.src = url;
    element.type = "text/javascript";
    head[0].AppendChild(scriptEl);
    // Listen for readyState changes
    ((mshtml.HTMLScriptEvents2_Event)element).onreadystatechange += delegate
    {
        if (element.readyState == "complete" || element.readyState == "loaded")
        {
            Callback.execute(callbackId);
        }
    };
}