Как узнать событие DocumentComplete и BeforeNavigate2 для всего документа?

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

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

  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)
{
}

person Ashish Kumar Shah    schedule 12.02.2014    source источник
comment
1 (и, возможно, 2) звучит так, как будто на него ответили:   -  person George Duckett    schedule 12.02.2014
comment
@GeorgeDuckett, часть о _pUnkSite неверна. Объект site не ссылается на верхний объект браузера.   -  person noseratio    schedule 12.02.2014
comment
@Noseratio: Хорошо, спасибо за исправление. Честно говоря, я не знаком с предметом, я просто нашел ответ (который был принят) и предположил, что он правильный (не глядя на комментарии).   -  person George Duckett    schedule 12.02.2014
comment
Да, DocumentComplete срабатывает для каждого кадра на веб-странице. Вот почему у него есть аргумент URL-адреса, вы можете использовать его и сравнить с URL-адресом, по которому вы изначально перешли, он будет последним. Подсчет кадров - это еще один способ. Проверьте этот ответ.   -  person Hans Passant    schedule 12.02.2014


Ответы (1)


Используйте параметр pDisp обработчиков событий BeforeNavigate2 и DocumentComplete, он ссылается на экземпляр объекта 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);
}
person noseratio    schedule 12.02.2014