获取IWebBrowser2指针的方法(一)

来源:互联网 发布:网络创世纪uo汉化 编辑:程序博客网 时间:2024/06/06 05:03

版权声明

请尊重原创作品。转载请保持文章完整性,并以超链接形式注明原始作者“tingsking18”和主站点地址,方便其他朋友提问和指正。

 

在Internet Explorer编程中,获取WebBrowser指针通常是一件很重要的事情,因为有了WebBrowser指针,我们就有了对IE完整的控制权。我们就可以对IE浏览器为所欲为了,想干什么都可以。比方说获取或者设置DOM控件的值。调用页面中的JavaScript,或者控制浏览器的行为 比方说刷新,前进、后退等等等等。。

 下面两篇文章中,我将介绍两种方法来获取IWebBrowser2指针。

第一种

使用OLEACC.dll动态库中的ObjectFromLresult函数来获取。

第二种

使用IShellWindows 获取当前浏览器个数,然后遍历获取浏览器对象和IWebBrowser指针。

参见:获取IWebBrowser2指针的方法(二)

 

下面介绍第一种方法:

在MSDN中对ObjectFromLresult函数的解释

The LresultFromObject function returns a reference, that is similar to a handle, to the specified object. Servers return this reference when handling WM_GETOBJECT.

所以就必须要调用::RegisterWindowMessage( _T("WM_HTML_GETOBJECT") );和SendMessageTimeout返回的与WM_GETOBJECT消息关联的值。这样就可以利用ObjectFromLresult来获取IHTMLDocument2指针,有了IHTMLDocument2,剩下的事情就是QueryInterface来获取IWebBrowser2指针,这样就很轻松了。

下面看下代码:

[cpp] view plain copy
  1. //用来接收EnumChildWindows的回调函数  
  2. //根据类名Internet Explorer_Server来判断是否是Internet Explorer控件  
  3. BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam)   
  4. {  
  5.     TCHAR buf[100];  
  6.     ::GetClassName( hwnd, (LPTSTR)&buf, 100 );  
  7.     if ( _tcscmp( buf, _T("Internet Explorer_Server") ) == 0 )   
  8.     {  
  9.         *(HWND*)lParam = hwnd; return FALSE;   
  10.     }   
  11.     else return TRUE;   
  12. };  
  13. IWebBrowser2* GetWBByhWnd(HWND hIEWindow)   
  14. {  
  15.     CoInitialize( NULL );  
  16.     // Explicitly load MSAA so we know if it's installed   
  17.     HINSTANCE hInst = ::LoadLibrary( _T("OLEACC.DLL") );  
  18.     IWebBrowser2* pWebBrowser2=NULL;  
  19.     if ( hInst != NULL )   
  20.     {   
  21.         HWND hWnd ;  
  22.         if(hIEWindow==NULL)  
  23.         {  
  24.             hWnd= FindWindow("IEFrame", NULL);  
  25.             if(hWnd==NULL)  
  26.                 hWnd= FindWindow("CabinetWClass", NULL);  
  27.             if( hWnd == NULL)  
  28.             {  
  29.                 MessageBox (NULL,"No Running instance of Internet Explorer!","message", MB_OK);  
  30.             }  
  31.             // walk Shell DocObject View->Internet Explorer_Server  
  32.             HWND hWndChild = FindWindowEx(hWnd, 0, "Shell DocObject View", NULL);  
  33.             if(hWndChild !=0)  
  34.             {  
  35.                 hWndChild = FindWindowEx(hWndChild, 0, "Internet Explorer_Server", NULL);  
  36.             }  
  37.             hWnd=hWndChild;  
  38.         }  
  39.         else  
  40.         {  
  41.             hWnd = hIEWindow;  
  42.             HWND hWndChild=NULL;   
  43.             // Get 1st document window   
  44.             EnumChildWindows( hWnd, EnumChildProc, (LPARAM)&hWndChild );   
  45.             if ( hWndChild )   
  46.             {  
  47.                 CComPtr<IHTMLDocument2> spDoc;  
  48.                 LRESULT lRes;   
  49.                 UINT nMsg = ::RegisterWindowMessage( _T("WM_HTML_GETOBJECT") );  
  50.                 ::SendMessageTimeout( hWndChild, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&lRes );   
  51.                 LPFNOBJECTFROMLRESULT pfObjectFromLresult = (LPFNOBJECTFROMLRESULT)::GetProcAddress( hInst, _T("ObjectFromLresult") );  
  52.                 if ( pfObjectFromLresult != NULL )   
  53.                 {  
  54.                     HRESULT hr;  
  55.                     hr = (*pfObjectFromLresult)( lRes, IID_IHTMLDocument2, 0, (void**)&spDoc );  
  56.                     if ( SUCCEEDED(hr) )   
  57.                     {  
  58.                         CComPtr<IHTMLWindow2>spWnd2;  
  59.                         CComPtr<IServiceProvider>spServiceProv;  
  60.                         hr=spDoc->get_parentWindow ((IHTMLWindow2**)&spWnd2);  
  61.                         if(SUCCEEDED(hr))  
  62.                         {  
  63.                             hr=spWnd2->QueryInterface (IID_IServiceProvider,(void**)&spServiceProv);  
  64.                             if(SUCCEEDED(hr))  
  65.                             {  
  66.                                 hr = spServiceProv->QueryService(SID_SWebBrowserApp,IID_IWebBrowser2,(void**)&pWebBrowser2);  
  67.                                 if(SUCCEEDED(hr))  
  68.                                 {  
  69.                                     return pWebBrowser2;  
  70.                                 }  
  71.                                   
  72.                             }  
  73.                         }  
  74.                     }  
  75.                 }  
  76.             } // else document not ready   
  77.         } // else Internet Explorer is not running   
  78.         ::FreeLibrary( hInst );   
  79.     } // else Active Accessibility is not installed   
  80.     CoUninitialize();   
  81.     return NULL;  
  82. }  

0 0
原创粉丝点击