从一个窗口句柄获取IWebBrowser2和IHTMLDocument2接口

本文提供了2个接口。


测试例子:调用之前请确保打开IE浏览器,运行程序,点击第一按钮,可以改变网页背景色,点击第二个按钮可以让网页转到百度首页

已将源代码上传:免积分下载地址 http://download.csdn.net/detail/moonshine99/4799948

源代码是VC6的开发环境,这个接口vs2008上也测过,可以用

/****************************************************************************
寻找指定类名的子窗口句柄 
****************************************************************************/
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

你可能感兴趣的:(界面类)