在IE中分叉或复制用户浏览器会话

时间:2008-11-05 09:00:06

标签: c++ internet-explorer com toolbar iwebbrowser2

是否可以在Internet Explorer插件中分叉用户会话(或执行类似操作)?

我想在用户单击工具栏中的按钮时处理用户所在的页面。为了避免中断用户浏览,我想“复制”所有内容,以便我可以在后台解析和处理页面。处理可能涉及诸如在Google搜索上加载结果链接的内容之类的内容,如果这是点击按钮的位置。

所以 - 我基本上想要的是模仿“Ctrl+N”,但是隐藏用户的窗口,这样它们就不会被打断。

如您所见,如果您在http://www.snee.com/xml/crud/posttest.html上填写并提交表单并按“Ctrl+N”,则发布的所有内容仍会显示在新窗口中,但不会发布数据两次。

我想以某种方式复制IWebBrowser2,但是:

  • 我不确定这是否可行(我无法在MSDN上找到任何信息)
  • 我不知道它是否也会复制会话。

创建IWebBrowser2的新实例并且只是导航到当前网址不是POST的有效解决方案 - 当然变量不会被转移。

3 个答案:

答案 0 :(得分:1)

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();
}

您提供浏览器和stream.HTH

-

迈克尔

答案 1 :(得分:0)

有趣的想法。你可以复制DOM holus-bolus,然后用副本替换一个新窗口的DOM。这只是猜测。在这一点上,我和你一样黑暗。

答案 2 :(得分:0)

我认为这是不可能的,因为你必须考虑很多细节,总会有所不同。仅举两个:

  • 您必须处理嵌入式Web浏览器(框架,IFRAME)。我认为复制主页只会复制其URL,以便在您将序列化主页恢复到某处时重新加载其内容,从而更改页面内容。所以你必须下到框架级别。
  • 您必须注意后面的脚本尝试连接到某个服务器以发送已经分叉的页面发送的数据。所以你可能会改变页面的逻辑。

因此,实时处理是用户看到它时捕获状态的唯一真正解决方案;如果这是你想要实现的目标。如果你不需要那么多细节,可能会更容易。