问题是我想获取此处创建的新标签的句柄值。
默认情况下,当您获取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的句柄值时,它将被捕获为当前窗口的主句柄,而不是新句柄的唯一句柄。