Получить значение дескриптора процесса окна браузера, которое запускается в новой вкладке - PullRequest
0 голосов
/ 27 декабря 2018

Проблема заключается в том, что я хочу получить значение дескриптора новой вкладки, созданной здесь.

По умолчанию, когда вы получаете значение дескриптора pWebBrowser2, оно попадает в качестве основного дескриптора текущего окна., а не уникальная ручка новой ручки.

Здесь есть одно рабочее условие.Инструменты IE -> Свойства обозревателя -> Общие -> Параметры вкладки -> Должно быть включено всегда открытое всплывающее окно в новом окне.

Всегда открывать всплывающее окно в новом окне Из-за настройки вновь открытое окно работает как отдельноеprocess.

Проблема в том, что вы не должны получать значение дескриптора после всплывающего окна, но мне нужно знать значение дескриптора до Navigate2.

Если вы предоставляете базовый файл примера длячтобы решить проблему, мы будем поддерживать $ 500 с PayPal.

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, оно попадает в качестве основного дескриптора текущего окна, а не уникального дескриптора нового дескриптора..

...