Получить значение дескриптора процесса окна браузера, которое запускается в новой вкладке
Проблема в том, что я хочу получить значение дескриптора новой вкладки, созданной здесь.
По умолчанию, когда вы получаете значение дескриптора pWebBrowser2, оно перехватывается как основной дескриптор текущего окна, а не как уникальный дескриптор нового дескриптора.
Здесь есть одно рабочее условие. Инструменты IE -> Свойства обозревателя -> Общие -> Параметры вкладки -> Всегда открывать всплывающее окно в новом окне.
Всегда открывать всплывающее окно в новом окне. Из-за настройки вновь открытое окно запускается как отдельный процесс.
Проблема в том, что вы не должны получать значение дескриптора после всплывающего окна, но мне нужно знать значение дескриптора до 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, оно перехватывается как основной дескриптор текущего окна, а не как уникальный дескриптор нового дескриптора.