internet-explorer - 如何在给定 PID 的情况下找到 IE8 窗口的 IWebBrowser2 指针?

标签 internet-explorer com webbrowser-control idispatch

到目前为止,我已成功使用以下函数检索指向正在运行的 Internet Explorer 实例的 IWebBrowser2 指针(给定其 PID)。

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 中这种明显的进程“重用”?

最佳答案

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

在此处查看更多信息:http://msdn.microsoft.com/en-us/library/aa752084%28VS.85%29.aspx

关于internet-explorer - 如何在给定 PID 的情况下找到 IE8 窗口的 IWebBrowser2 指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1232234/

相关文章:

c++ - 检查 COM 指针是否存在

c# - 动态创建的 WebBrowser 不起作用

javascript - Webbrowser 控件如何更改窗口 javascript 属性?

java - table.findElements(By.tagName ("td") 在 RemoteWebDriver/Internet Explorer 中失败

facebook - FB.XFBML.parse 在 IE 中不起作用

jquery - IE9跨域AJAX请求

c# - 如何在不引用的情况下在 C# 中使用非托管 COM DLL

c++ - 我可以在 std::map 中使用 CComPtr 吗?

c# - 我们如何返回用户在 webBrowser 控件中单击的按钮的名称?

javascript - 在 IE(7+) 中嵌入音频,使用 javascript 静音和取消静音功能