Создать или скопировать сеанс браузера пользователя в IE - PullRequest
3 голосов
/ 05 ноября 2008

Возможно ли создать пользовательский сеанс (или сделать что-то подобное) в плагине Internet Explorer?

Я хочу обработать страницу, на которой находится пользователь, когда он нажимает кнопку на панели инструментов. Чтобы не прерывать работу пользователей, я бы хотел «скопировать» все, чтобы можно было проанализировать и обработать страницу в фоновом режиме. Обработка может включать такие вещи, как загрузка содержимого ссылок на результаты поиска Google, если именно здесь была нажата кнопка.

Итак, я в основном хочу подражать "Ctrl+N", но скрыть окно от пользователя, чтобы они не были прерваны.

Как вы можете видеть, если вы заполните и отправите форму на http://www.snee.com/xml/crud/posttest.html и нажмете "Ctrl+N", все опубликованное будет по-прежнему отображаться в новом окне, но не будет публиковать данные дважды .

Я думал о том, чтобы как-то скопировать IWebBrowser2, но:

  • Я не уверен, возможно ли это (я не смог найти никакой информации в MSDN)
  • Я не знаю, копирует ли он также и сессии.

Создание нового экземпляра IWebBrowser2 и простой переход к текущему URL-адресу не является правильным решением, поскольку POST-переменные, конечно, не переносятся.

Ответы [ 3 ]

1 голос
/ 27 января 2009

BHO или плагин будет работать. Есть так много вариантов, чтобы получить источник, это своего рода. выбери свое равновесие. Ищите IDocHostUIHandler, чтобы изменить поведение. IHTMLElementCollection для разбора страницы в браузере. Самая простая вещь, о которой я могу думать на данный момент, это ...

Сохранить текущее содержимое в поток. так же, как получить / просмотреть исходный код.

// #include 
HRESULT SaveDocumenttoStream(IWebBrowser* pWebBrowser, 
                             IStream* pStream)
{
HRESULT hr;
IDispatch* pHtmlDoc = NULL;
IPersistStreamInit* pPersistStreamInit = NULL;
hr = pWebBrowser->get_Document( &pHtmlDoc );
if ( SUCCEEDED(hr) && pHtmlDoc)
{
  // Query for IPersistStreamInit.
  hr = pHtmlDoc->QueryInterface( IID_IPersistStreamInit,
                               (void**)&pPersistStreamInit );
  if ( SUCCEEDED(hr) )
  { 
     hr = pPersistStreamIni->Save(, True);
     pPersistStreamInit->Release(); 
  }
  pHtmlDoc->Release();
}

Вы предоставляете браузер и поток. HTH

-

Michael

0 голосов
/ 29 марта 2010

Я думаю, что это невозможно сделать, потому что вы должны думать о многих деталях, что-то всегда сломается. Просто упомянуть два:

  • Вы должны позаботиться о встроенных веб-браузерах (фреймах, IFRAMEs). Я думаю, что копирование главной страницы просто скопировало бы их URL, поэтому их содержимое будет перезагружено, когда вы где-нибудь восстановите сериализованную главную страницу, таким образом, содержимое вашей страницы изменится. Так что вам придется спуститься до уровня кадра.
  • Вы должны позаботиться о сценариях, которые за вашей спиной пытаются подключиться к какому-либо серверу для отправки данных, которые уже были отправлены страницей, которую вы разветвили. Так что вы можете изменить логику страницы.

Таким образом, обработка в реальном времени - единственное верное решение для захвата состояния, как его видят пользователи; если это то, чего вы хотите достичь. Если вам не нужно так много деталей, это может быть легче сделать.

0 голосов
/ 13 ноября 2008

Интересная мысль. Не могли бы вы скопировать DOM holus-bolus и затем заменить DOM нового окна на копию? Это всего лишь предположение. В этот момент я нахожусь в темноте так же, как и вы.

...