remarks cref c# .net com browser bho

c# - cref - DocumentComplete se activa antes de que la página se cargue por completo



remarks c# (1)

¿Por qué se dispara el evento DocumentComplete del objeto COM WebBrowser antes de que se cargue la página? Pensé que este evento solo se activará cuando la página se muestre por completo en la ventana del navegador.

esta es mi implementación de 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; } }


Porque hay otros documentos en una página. Un iframe o una imagen, por ejemplo, activará el evento DocumentComplete . Lo que debe hacer es asegurarse de que el objeto que generó DocumentComplete sea ​​la página real. Por ejemplo:

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 }

Donde _pUnkSite es el sitio que se pasó desde SetSite .