Автоматизация IE: как определить, когда происходит навигация, инициированная пользователем? - PullRequest
1 голос
/ 18 января 2009

У меня есть Internet Explorer BHO (в c # .net), и я хочу определить, когда пользователь инициирует навигацию или когда навигация, инициированная пользователем, завершена. Под пользовательской инициативой я имею в виду нажатие на ссылку или подобное действие. В частности, если в загружаемом документе есть несколько фреймов, я хочу рассматривать их как единую «навигацию», но я не могу придумать простого способа сделать это. Я знаю события BeforeNavigate2 и DocumentComplete, но не вижу способа различить срабатывание BeforeNavigate / DocumentComplete, когда пользователь нажимает на ссылку, и срабатывание из-за загрузки фрейма.

Одним из возможных решений, которое я думаю, является то, что BeforeNavigate2 для верхнего фрейма всегда запускается раньше, чем для внутренних фреймов (очевидно), а затем DocumentComplete дочерних фреймов вызывается до DocumentComplete верхнего, что всегда называется последним. Так, например, я мог бы увеличить счетчик в BeforeNavigates и уменьшить его в DocumentComplete, и только когда он равен 0, это пользовательская навигация.

Но я не уверен, могу ли я положиться на это или есть лучший способ сделать это. например Что произойдет, если пользователь нажимает ESC после завершения загрузки одного из фреймов, но не всех ли когда-либо вызывается DocumentComplete верхнего фрейма?

Есть предложения?

1 Ответ

0 голосов
/ 21 мая 2009

Вы можете проверить, пришло ли событие BeforeNavigate / NavigateComplete / DocumentComplete из кадра ineere или самого простого из них, протестировав pDispParams сопоставления с указателем на объект браузера, сохраненный в SetSite метод вашего BHO.

Вот код C ++, чтобы сделать это, я надеюсь, вы можете легко преобразовать его в C #:

STDMETHODIMP MyBHO::Invoke(DISPID dispidMember,
  REFIID riid, 
  LCID lcid,
  WORD wFlags,
  DISPPARAMS* pDispParams,
  VARIANT* pvarResult,
  EXCEPINFO* pExcepInfo,
  UINT* puArgErr)
{
  if( dispidMember != DISPID_BEFORENAVIGATE2 &&
      dispidMember != DISPID_NAVIGATECOMPLETE2 &&
      dispidMember != DISPID_DOCUMENTCOMPLETE )
    return S_OK;

  CComQIPtr<IWebBrowser2, &IID_IWebBrowser2> frame =
    pDispParams->rgvarg[ 1 ].pdispVal;

  if( webBrowser2 != frame )
    return S_OK;
}

webBrowser2 - указатель на объект браузера, который вы получили в методе SetSite ,

...