c# - DocumentComplete 在页面完全加载之前触发

标签 c# .net com browser bho

为什么 WebBrowser COM 对象的 DocumentComplete 事件在页面加载之前触发?我认为只有当页面在浏览器窗口中完全呈现时才会触发此事件。

这是我的 BHO 实现:

[ComVisible(true),
Guid("5a954357-44bd-4660-9570-17bb1b71eeaa"),
ClassInterface(ClassInterfaceType.None)]
public class BHO : IObjectWithSite
{
    private WebBrowser browser;
    private DateTime startTime;
    private DateTime endTime;
    private object _pUnkSite;

    public void OnDocumentComplete(object pDisp, ref object URL)
    {
        if (!ReferenceEquals(pDisp, _pUnkSite))
        {
            return;
        }

        using (StreamWriter sw = File.AppendText("log_path"))
        {
            endTime = DateTime.Now;
            TimeSpan ts = endTime.Subtract(startTime);
            sw.WriteLine("completed in {0}.{1}", ts.Seconds, ts.Milliseconds);
        }

    }

    public void OnBeforeNavigate2(object pDisp, ref object URL, ref object Flags, ref object TargetFrameName, ref object PostData, ref object Headers, ref bool Cancel)
    {
        if (!ReferenceEquals(pDisp, _pUnkSite))
        {
            return;
        }
        startTime = DateTime.Now;
    }

    public int SetSite(object site)
    {
        if (site != null)
        {
            _pUnkSite = site;
            browser = (WebBrowser)site;   
            browser.DocumentComplete += new DWebBrowserEvents2_DocumentCompleteEventHandler(this.OnDocumentComplete);
            browser.BeforeNavigate2 += new DWebBrowserEvents2_BeforeNavigate2EventHandler(this.OnBeforeNavigate2);
        }
        else
        {
            browser.DocumentComplete -= new DWebBrowserEvents2_DocumentCompleteEventHandler(this.OnDocumentComplete);
            browser.BeforeNavigate2 -= new DWebBrowserEvents2_BeforeNavigate2EventHandler(this.OnBeforeNavigate2);
            browser = null;

        }
        return 0;
    }

    public int GetSite(ref Guid guid, out IntPtr ppvSite)
    {
        IntPtr punk = Marshal.GetIUnknownForObject(browser);
        int hr = Marshal.QueryInterface(punk, ref guid, out ppvSite);
        Marshal.Release(punk);

        return hr;
    }
}

最佳答案

因为页面上还有其他文档。例如,iframe 或图像将触发 DocumentComplete 事件。您需要做的是确保引发 DocumentComplete 的对象是实际页面。例如:

private void _webBrowser2Events_DocumentComplete(object pdisp, ref object url)
{
    if (!ReferenceEquals(pdisp, _pUnkSite))
    {
        //Exit, because the DocumentComplete is not the document complete for the page.
        return;
    }
    //Do your normal stuff here
}

其中 _pUnkSite 是从 SetSite 传入的站点.

关于c# - DocumentComplete 在页面完全加载之前触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8359379/

相关文章:

c# - 检测是否安装了 SQLCMD.exe 的正确方法?

c# - 您如何处理具有不同类型结果的重写函数?

c# - 用户无法轻易入侵的 Windows 应用程序的安全数据库后端

c# - 为什么我的异常没有被捕获?

c++ - 如何通过 COM (C++) API 传递字符串数组

com - 可以将 VB6 组件编译为 64 位吗?

c# - 为什么第一个代码立即显示错误消息,但第二个不

c# - 银光和 WCF : Max message size

.net - MVC 5 中的 web.config 中 <system.codedom>/<compilers> 到底做了什么?

c++ - CoCreateInstance 不启动或连接到 ATL COM 服务