IWebBrowser2* GetIEAppFromHWnd(HWND hIEWindow)
{
HWND hWnd = FindWindowEx(hIEWindow, 0, "Shell Embedding", NULL);
HWND hWndChild = FindWindowEx(hWnd, 0, "Shell DocObject View", NULL);
hWnd = FindWindowEx(hWndChild, 0, "Internet Explorer_Server", NULL);
if ( hWnd == NULL ) return FALSE;
// 我们需要显示地装载OLEACC.DLL,这样我们才知道有没有安装MSAA
HINSTANCE hInst = LoadLibrary( _T("OLEACC.DLL") );
IWebBrowser2* pWebBrowser2 = NULL;
if ( hInst == NULL ) return NULL;
LRESULT lRes;
UINT nMsg = ::RegisterWindowMessage( _T("WM_HTML_GETOBJECT") );
::SendMessageTimeout( hWnd, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&lRes );
LPFNOBJECTFROMLRESULT pfObjectFromLresult = (LPFNOBJECTFROMLRESULT)::GetProcAddress( hInst, _T("ObjectFromLresult") );
if ( pfObjectFromLresult != NULL )
{
HRESULT hr;
CComPtr<IHTMLDocument2>spDoc;
hr=pfObjectFromLresult(lRes,IID_IHTMLDocument2,0,(void**)&spDoc);
if ( SUCCEEDED(hr) )
{
CComPtr<IHTMLWindow2>spWnd2;
CComPtr<IServiceProvider>spServiceProv;
hr=spDoc->get_parentWindow ((IHTMLWindow2**)&spWnd2);
if(SUCCEEDED(hr))
{
hr=spWnd2->QueryInterface (IID_IServiceProvider,(void**)&spServiceProv);
if(SUCCEEDED(hr))
{
hr = spServiceProv->QueryService(SID_SWebBrowserApp,
IID_IWebBrowser2,
(void**)&pWebBrowser2);
if (SUCCEEDED(hr))
{
::FreeLibrary(hInst);
return pWebBrowser2;
//IDispatch *app;
//hr = pWebBrowser2->get_Application(&app);
//if (SUCCEEDED(hr))
//{
// //MessageBox(NULL, "BINGO", 0, MB_OK);
// return app;
//}
}
}
}
}
}
::FreeLibrary(hInst);
return NULL;
}