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;
}
}
我檢查了你的方法。不幸的是,它不工作:(我比較頁面加載時間與HttpWatch,並且有約40%的差異。DocumentComplete過早火災 – user1013552
@ user1013552你可以編輯你的問題,幷包括你的BHO的代碼? – vcsjones
或者也許HttpWatch顯示不正確的數據.. 。 – user1013552