/**************************************************************************** 寻找指定类名的子窗口句柄 ****************************************************************************/ HWND FindWithClassName(HWND ParentWnd,TCHAR* FindClassName) { HWND hChild = ::GetWindow(ParentWnd, GW_CHILD); for(; hChild!=NULL ; hChild=::GetWindow(hChild,GW_HWNDNEXT)) { TCHAR ClassName[100]={0}; ::GetClassName(hChild,ClassName,sizeof(ClassName)/sizeof(TCHAR)); if (_tcscmp(ClassName,FindClassName)==0) return hChild; HWND FindWnd=FindWithClassName(hChild,FindClassName); if (FindWnd) return FindWnd; } return NULL; } /**************************************************************************** 从一个窗口句柄获取IHTMLDocument2接口 使用完后要调用Release 如果找不到接口,返回NULL 原理: 如果你的系统安装了Microsoft 活动辅助功能(MSAA),则您可以向浏览器窗口 (类名"Internet Explorer_Server")发送WM_HTML_GETOBJECT消息,将消息返回的结果 作为一个参数传递给MSAA函数ObjectFromLresult,从而获取IHTMLDocument2 接口。 必须包含的头文件 #include #include #include //需要安装ATL库 ****************************************************************************/ #include #include #include //You can store the interface pointer in a member variable //for easier access void GetIHTMLDocument2Interface(HWND BrowserWnd) { CoInitialize(NULL); HRESULT hr; // Explicitly load MSAA so we know if it's installed HINSTANCE hInst = ::LoadLibrary( _T("OLEACC.DLL") ); if ( hInst ) { LRESULT lRes; //SendMessageTimeout后的返回值,用于函数pfObjectFromLresult的第1个参数 UINT nMsg = ::RegisterWindowMessage( _T("WM_HTML_GETOBJECT") ); ::SendMessageTimeout( BrowserWnd, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&lRes ); //获取函数pfObjectFromLresult LPFNOBJECTFROMLRESULT pfObjectFromLresult = (LPFNOBJECTFROMLRESULT)::GetProcAddress( hInst, _T("ObjectFromLresult") ); if ( pfObjectFromLresult ) { CComPtr spDoc; hr = (*pfObjectFromLresult)( lRes, IID_IHTMLDocument, 0, (void**)&spDoc ); if ( SUCCEEDED(hr) ) { //获取文档接口 CComPtr spDisp; spDoc->get_Script( &spDisp ); CComQIPtr spWin=spDisp; spWin->get_document( &spDoc.p ); // Change background color to red spDoc->put_bgColor( CComVariant("red") ); } // else document not ready } // else Internet Explorer is not running ::FreeLibrary( hInst ); } // else Active Accessibility is not installed CoUninitialize(); } /**************************************************************************** //调用测试,测试的时候360会拦截2012年11月测的,先关闭360, 打开IE浏览器IE6和IE8都测过,能改变背景色,有些网页写了保护改变不了, 试过百度新闻,百度知道是可以改变的,没有研究网页的CSS之类的兼容。。 ****************************************************************************/ void CDemoDlg::OnButton1() { //获取IE主窗口 HWND ExplorerWnd=::FindWindow(_T("IEFrame"),NULL); if (!ExplorerWnd) ::MessageBox(m_hWnd,TEXT("没有找打IE窗口"),NULL,MB_OK); ::SetForegroundWindow(ExplorerWnd); //根据IE主窗口获取浏览器窗口 HWND BrowserWnd=FindWithClassName( ExplorerWnd , _T("Internet Explorer_Server")); if ( BrowserWnd ) { GetIHTMLDocument2Interface(BrowserWnd); } } /**************************************************************************** 如何从一个窗口句柄获取IWebBrowser2接口 使用完后要调用Release 如果找不到接口,返回NULL 原理: 如果你的系统安装了Microsoft 活动辅助功能(MSAA),则您可以向浏览器窗口 (类名"Internet Explorer_Server")发送WM_HTML_GETOBJECT消息,将消息返回的结果 作为一个参数传递给MSAA函数ObjectFromLresult,从而获取IServiceProvider接口。 IServiceProvider是IWebBrowser2, IDocument2等公共的方法,请重视这个接口 必须包含的头文件 #include #include #include //需要安装ATL库 ****************************************************************************/ #include #include #include //需要安装ATL库 //测试代码中的_bstr_t 需要使用COMUTIL.H> #include #pragma comment(lib,"comsupp.lib") IWebBrowser2* GetIWebBrowserInterface(HWND BrowserWnd) { CoInitialize(NULL); //这句话要放在类的构造函数中 IWebBrowser2* pWebBrowser2=NULL; HRESULT hr; // Explicitly load MSAA so we know if it's installed HINSTANCE hInst = ::LoadLibrary( _T("OLEACC.DLL") ); if ( hInst ) { LRESULT lRes; UINT nMsg = ::RegisterWindowMessage( _T("WM_HTML_GETOBJECT") ); ::SendMessageTimeout( BrowserWnd, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&lRes ); LPFNOBJECTFROMLRESULT pfObjectFromLresult = (LPFNOBJECTFROMLRESULT)::GetProcAddress( hInst, _T("ObjectFromLresult") ); if ( pfObjectFromLresult ) { CComPtr spServiceProv; hr = (*pfObjectFromLresult)( lRes, IID_IServiceProvider, 0, (void**)&spServiceProv ); if ( SUCCEEDED(hr) ) { hr = spServiceProv->QueryService(SID_SWebBrowserApp, IID_IWebBrowser2,(void**)&pWebBrowser2); } // else document not ready } // else Internet Explorer is not running ::FreeLibrary( hInst ); } // else Active Accessibility is not installed CoUninitialize(); //这句话要放在类的析构函数中,否则返回值即使不是空指针也无效 return SUCCEEDED(hr) ? pWebBrowser2 : NULL; } /**************************************************************************** //调用测试 ****************************************************************************/ void CDemoDlg::OnButton2() { //获取IE主窗口 HWND ExplorerWnd=::FindWindow(_T("IEFrame"),NULL); if (!ExplorerWnd) ::MessageBox(m_hWnd,TEXT("没有找打IE窗口"),NULL,MB_OK); ::SetForegroundWindow(ExplorerWnd); //根据IE主窗口获取浏览器窗口 HWND BrowserWnd=FindWithClassName( ExplorerWnd , _T("Internet Explorer_Server")); if ( BrowserWnd ) { IWebBrowser2* pWebBrowser2=GetIWebBrowserInterface(BrowserWnd); if (pWebBrowser2) { //浏览网页 _bstr_t bsSite= "http://www.baidu.com/"; VARIANT vEmpty; VariantInit(&vEmpty); pWebBrowser2->Navigate(bsSite, &vEmpty, &vEmpty, &vEmpty, &vEmpty); //获取窗口 HWND wnd; pWebBrowser2->get_HWND((LONG*)(&wnd)); pWebBrowser2->Release(); } } }
调用之前请确保打开IE浏览器 已经源代码上传:免积分下载地址 http://download.csdn.net/detail/moonshine99/4799948 源代码是VC6的开发环境,这个接口vs2008上也测过,可以用
还有一个例子: 通过COM操作IE浏览器的一个类,在程序中 加入类即可直接通过类操作IE http://download.csdn.net/detail/moonshine99/4807289 |