2011-12-02 110 views
1

爲什麼WebBrowser COM對象的DocumentComplete事件在加載頁面之前觸發?我認爲只有在瀏覽器窗口中完全呈現頁面時纔會觸發此事件。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; 
    } 
} 

回答

2

因爲有一個頁面上的其他文件。例如,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通過該網站。

+0

我檢查了你的方法。不幸的是,它不工作:(我比較頁面加載時間與HttpWatch,並且有約40%的差異。DocumentComplete過早火災 – user1013552

+0

@ user1013552你可以編輯你的問題,幷包括你的BHO的代碼? – vcsjones

+0

或者也許HttpWatch顯示不正確的數據.. 。 – user1013552

相關問題