IWebBrowser2[color=#0000ff]* GetIEFromHWnd(HWND hIEWindow) 
{ HWND hWnd ; 
if(hIEWindow==NULL){ 
  hWnd= FindWindow("IEFrame", NULL); 
            if(hWnd==NULL) 
  hWnd= FindWindow("CabinetWClass", NULL); 
    if( hWnd == NULL){ 
      MessageBox (NULL,"No Running instance of Internet Explorer!","message", MB_OK); 
    } 
    // walk Shell DocObject View->Internet Explorer_Server 
    HWND hWndChild = FindWindowEx(hWnd, 0, "Shell DocObject View", NULL); 
    if(hWndChild !=0){ 
      hWndChild = FindWindowEx(hWndChild, 0, "Internet Explorer_Server", NULL); 
  } 
  hWnd=hWndChild; 

else{ 
  hWnd=hIEWindow; 

// 我们需要显示地装载OLEACC.DLL,这样我们才知道有没有安装MSAA 
HINSTANCE hInst = LoadLibrary( _T("OLEACC.DLL") ); 
IWebBrowser2* pWebBrowser2=NULL; 
if ( hInst != NULL ){ 
  if ( hWnd != 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);       
      } 
    } 
    }     } 
  } 
  
  ::FreeLibrary(hInst); 

else{//如果没有安装MSAA 
  MessageBox(NULL,_T("Please Install Microsoft Active Accessibility"),"Error",MB_OK); 

return pWebBrowser2; 

如何改写啊,我找了很久在C#中的IServiceProvider只有两个参数,好像在net3.5有这个是三个的而且参数类型也一样

解决方案 »

  1.   

    已经解决了,我把代码贴出来共享
    WinAPIUtil.SendMessageTimeout(hWnd, nMsg, 0, 0,WinAPIUtil.SMTO_ABORTIFHUNG, 1000, out lRes);
                    if (!(bool)(lRes == 0))
                    {
                        int hr = WinAPIUtil.ObjectFromLresult(lRes, ref IID_IHTMLDocument, 0, ref document);
                        if ((document != null))
                        {
                            object objIWebBrowser2;
                            IntPtr puk = Marshal.GetIUnknownForObject(document.parentWindow);                                               
                            Marshal.QueryInterface(puk,ref guidIHTMLWindow2, out ppv);                        
                            Marshal.QueryInterface(ppv,ref IID_IServiceProvider, out ppvSp);
                            IServiceProvider sp = (IServiceProvider)Marshal.GetObjectForIUnknown(ppvSp);
                            sp.QueryService(ref SID_SWebBrowserApp, ref guidIWebBrowser2, out objIWebBrowser2);
                            IWebBrowser2 iweb2 = objIWebBrowser2 as IWebBrowser2;
                            MessageBox.Show(iweb2.LocationURL);                                                
                        }
                    }
      

  2.   

    对了还要加最主要的一句,不然就不行,我卡这句话N久了
    [
            ComImport, Guid("6d5140c1-7436-11ce-8034-00aa006009fa"),
            InterfaceType(ComInterfaceType.InterfaceIsIUnknown)
            ]
            public interface IServiceProvider
            {
                void QueryService(ref Guid guidService, ref Guid riid, [MarshalAs(UnmanagedType.Interface)] out object ppvObject);
            }
      

  3.   

    WinAPIUtil是不是自己写的代码,楼主可以发给我参考吗?[email protected]万分感谢