获取在新选项卡中启动的浏览器窗口的进程句柄值

时间:2018-12-27 13:08:33

标签: c++ mfc iwebbrowser2

问题是我想获取此处创建的新标签的句柄值。

默认情况下,当您获取pWebBrowser2的句柄值时,它将被捕获为当前窗口的主句柄,而不是新句柄的唯一句柄。

这里有一种工作状态。 IE工具-> Internet选项->常规->选项卡设置->应启用始终在新窗口中打开弹出窗口。

始终在新窗口中打开弹出窗口。由于进行了此设置,新打开的窗口作为单独的进程运行。

问题在于,在窗口弹出后您不应该获取句柄值,但是我需要在Navigate2之前知道句柄值。

如果您提供了解决此问题的基本示例文件,我们将通过PayPal支持$ 500。

CString strUrl = _T("http://www.google.com");

CoInitialize(NULL);

HINSTANCE hInst = ::LoadLibrary(_T("OLEACC.DLL"));

if (hInst != NULL)
{
    if (hwnd)
    {
        CComPtr<IHTMLDocument2> spDoc;
        LRESULT lRes;

        UINT nMsg = ::RegisterWindowMessage(_T("WM_HTML_GETOBJECT"));
        ::SendMessageTimeout(hwnd, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&lRes);

        HRESULT hr = ::ObjectFromLresult(lRes, IID_IHTMLDocument2, 0, (void**)&spDoc);

        if (SUCCEEDED(hr))
        {
            CComPtr<IHTMLWindow2> spWnd2;
            hr = spDoc->get_parentWindow((IHTMLWindow2**)&spWnd2);

            if (SUCCEEDED(hr))
            {
                CComPtr<IServiceProvider> spServiceProv;
                hr = spWnd2->QueryInterface(IID_IServiceProvider, (void**)&spServiceProv);

                if (SUCCEEDED(hr))
                {
                    IWebBrowser2* pWebBrowser2 = 0;
                    hr = spServiceProv->QueryService(IID_IWebBrowserApp, IID_IWebBrowser2, (void**)&pWebBrowser2);

                    if (SUCCEEDED(hr))
                    {
                        // Here IWebBrowser2 makes navigate2 as a new tab.

                        VARIANT vtUrl;
                        VariantInit(&vtUrl);
                        vtUrl.vt = VT_BSTR;
                        vtUrl.bstrVal = strUrl.AllocSysString();

                        VARIANT vFlags;
                        V_VT(&vFlags) = VT_I4;
                        V_I4(&vFlags) = navOpenInNewWindow;

                        VARIANT vEmpty;
                        VariantInit(&vEmpty);

                        pWebBrowser2->Navigate2(&vtUrl, &vFlags, &vEmpty, &vEmpty, &vEmpty);

                        VariantClear(&vtUrl);
                        VariantClear(&vFlags);
                        VariantClear(&vEmpty);

                        pWebBrowser2->Release();
                    }

                    spServiceProv.Release();
                }

                spWnd2.Release();
            }

            spDoc.Release();
        }
    }

    ::FreeLibrary(hInst);

}

CoUninitialize();

基本上,当您获得pWebBrowser2的句柄值时,它将被捕获为当前窗口的主句柄,而不是新句柄的唯一句柄。

0 个答案:

没有答案