2014-02-12 4 views
2

Я учусь писать BHO в C#, и у меня есть обработчики событий для DocumentComplete и BeforeNavigate2. Во время отладки я замечаю, что они запускаются несколько раз для определенных веб-страниц, таких как yahoo.co.in.Как узнать, как найти документ DocumentComplete и BeforeNavigate2 для всего документа?

Я понимаю, что это может быть связано с наличием нескольких кадров на странице. Мои вопросы: -

  1. Как узнать, что является событием для полной загружаемой страницы?
  2. Как узнать, какое событие инициируется, когда мы собираемся перейти от страницы?

Добавление некоторые примеры кода

private InternetExplorer iExplorer; 
int IObjectWithSite.SetSite(object pUnkSite) 
{ 
    if (pUnkSite != null) 
    { 
     ieInstance = (InternetExplorer)pUnkSite; 
     // Register the DocumentComplete event. 
     ieInstance.DocumentComplete += new DWebBrowserEvents2_DocumentCompleteEventHandler(ieInstance_DocumentComplete); 
     ieInstance.BeforeNavigate2 += new DWebBrowserEvents2_BeforeNavigate2EventHandler(ieInstance_BeforeNavigate2); 
    } 
    return 0; 
} 

private void ieInstance_BeforeNavigate2(object pDisp, ref object URL, ref object Flags, ref object TargetFrameName, ref object PostData, ref object Headers, ref bool Cancel) 
{ 
} 

private void ieInstance_DocumentComplete(object pDisp, ref object URL) 
{ 
} 
+1

1 (и, возможно, 2) звучит так, будто на это отвечает: http://stackoverflow.com/a/8359461/593627 –

+0

@GeorgeDuckett, часть он о '_PUnkSite' ошибочен. Объект сайта не относится к верхнему объекту браузера. – Noseratio

+1

@Noseratio: Хорошо, спасибо за исправление. Честно говоря, я не знаком с предметом, я только что нашел ответ (который был принят) и предположил, что он верен (не глядя на комментарии). –

ответ

2

использовать параметр из обработчиков событий BeforeNavigate2 и DocumentCompletepDisp, это относится к экземпляру SHDocVw.WebBrowser объекта, соответствующего кадра (или верхний браузер):

static bool IsTop(object pDisp) 
{ 
    var thisBrowser = pDisp as SHDocVw.WebBrowser; 
    var parent = thisBrowser .Parent as SHDocVw.WebBrowser; 
    return (parent == thisBrowser || parent == null); 
}