2009-08-05 57 views
2

到目前为止,我已经成功地使用以下函数来检索指向运行的Internet Explorer实例的IWebBrowser2指针,因为它是PID。如何在给定PID的IE8窗口中找到IWebBrowser2指针?

static SHDocVw::IWebBrowser2Ptr findBrowserByPID(DWORD pid) 
{ 
    SHDocVw::IShellWindowsPtr ptr; 
    ptr.CreateInstance(__uuidof(SHDocVw::ShellWindows)); 
    if (ptr == NULL) { 
     return 0; 
    } 

    // number of shell windows 
    const long nCount = ptr->GetCount(); 

    // iterate over all shell windows 
    for (long i = 0; i < nCount; ++i) { 
     // get interface to item no i 
     _variant_t va(i, VT_I4); 
     IDispatchPtr spDisp = ptr->Item(va); 

     SHDocVw::IWebBrowser2Ptr spBrowser(spDisp); 
     if (spBrowser != NULL) { 
      // if there's a document we know this is an IE object 
      // rather than a Windows Explorer instance 
      HWND browserWindow; 
      try { 
       browserWindow = (HWND)spBrowser->GetHWND(); 
      } catch (const _com_error &e) { 
       // in case ->GetHWND() fails 
       continue; 
      } 

      DWORD browserPID; 
      GetWindowThreadProcessId(browserWindow, &browserPID); 
      if (browserPID == pid) { 
       return spBrowser; 
      } 
     } 
    } 
    return 0; 
} 

我做的是通过CreateProcess发动explorer.exe进程,然后使用上面的函数来检索IWebBrowser2Ptr给它(这样我就可以与浏览器拨弄)。

不幸的是,这似乎不再适用于Internet Explorer 8,因为IE8似乎重用了进程 - 至少在某种程度上。对于两个代码序列,如:

PROCESS_INFORMATION pi; 
// ... 

if (CreateProcess(..., &pi)) { 
    // Wait a bit to give the browser a change to show its window 
    // ... 

    IWebBrowser2 *pWebBrowser = findBrowserByPID(pi.dwProcessId); 
} 

该代码的第一次运行正常,第二次运行没有设法检索pWebBrowser窗口。

经过一些调试后,发现findBrowserByPID函数确实找到了很多浏览器窗口(并且在启动第二个浏览器实例后发现更多),但它们都不属于新启动的进程。看起来,所有的窗口都属于第一个启动的IE进程。

有没有人知道另一种方法来获取IWebBrowser2指针某些IE8实例?或者是否有一种方法可以禁用IE8的这种明显的“重用”进程?

+2

您可以使用注册表项来禁用LCIE,但这不是最终用户支持的配置,并且如果您对自己的机器以外的任何设备执行此操作,则这样做并不合适。 值得注意的是,今天发生的任何“pid-to-IWB2”方法并不一定能在未来发挥作用。 IE不公开此功能支持的API。 – EricLaw 2009-08-07 01:24:21

+0

@EricLaw:啊,谢谢你放弃了'LCIE'这个词,这对谷歌来说是一件好事! – 2009-08-07 09:10:01

回答

1

如果您自己启动IE进程,请不要使用CreateProcess--而应使用CoCreateInstance。这将返回一个可以查询IWebBrowser2的对象,您可以随意使用它。其中一个复杂性是,如果导航穿过完整性级别(Vista +),指针将变为无效。要解决这个问题,请同步NewProcess事件,这将允许您检测这种情况。

看到这里一些更多的信息:http://msdn.microsoft.com/en-us/library/aa752084%28VS.85%29.aspx

1

一对夫妇的替代方法可能是: