Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Как получить HTML-код из окна Internet Explorer...


Автор: chipset 28.2.2005, 22:27
 Используется код, взятый с http://www.codeguru.com/ieprogram/enumIE.html.

Примечание: исправлен баг, вызывающий exception при запуске в Windows с версией, отличающейся от той, в которой программа была скомпилирована.

Всё что нужно - это:
1) добавить в начало программы CoInitialize(0); или AfxOleInit();
2) в исходнике, там где нужно получить текст из окна IE, написать:
Код

// самое начало файла
#pragma warning(disable : 4192)
#pragma warning(disable : 4146)
#import <mshtml.tlb>
#import <shdocvw.dll> 
#include <mshtml.h>


// ...........


// функция получает HWND, URL и HTML-текст из всех окон IE в системе
// результат - строка с собранной инфой
CString  InternetExplorerHook()
{
     CString strResult, strTemp;

     // получаем интерфейс IShellWindowsPtr
     SHDocVw::IShellWindowsPtr m_spSHWinds;
     if(m_spSHWinds.CreateInstance(__uuidof(SHDocVw::ShellWindows)) != S_OK)
     {
          AfxMessageBox("Shell Windows interface is not avilable");
               return "Error !";
     }

     // идём по списку окон IE в системе
     IDispatchPtr spDisp;
     long nCount = m_spSHWinds->GetCount();
     for (long i = 0; i < nCount; i++)
     {
          _variant_t va(i, VT_I4);
          spDisp = m_spSHWinds->Item(va);

          SHDocVw::IWebBrowser2Ptr spBrowser(spDisp);
          if(spBrowser != NULL)
          {
               // тут начинается самое интересное
               long hWnd; spBrowser->get_HWND(&hWnd);
               BSTR strURL; spBrowser->get_LocationURL(&strURL);

               strTemp.Format("\r\nFound a new IE window (HWND = %x)\r\nURL = %s",
                                             hWnd, CString(strURL));
               strResult += strTemp;

               IDispatchPtr spDisp;

               if(spBrowser->get_Document(&spDisp) == S_OK && spDisp!= 0)
               {
                    IDispatch *pUnk = spDisp;
                    IHTMLDocument2 *spHtmlDocument;
                    spDisp->QueryInterface(IID_IHTMLDocument2, (void**) &spHtmlDocument);
                    if(spHtmlDocument != 0)
                    {
                         IHTMLElement *spHtmlElement;
                         spHtmlDocument->get_body(&spHtmlElement);
                         if(spHtmlElement != 0) 
                         {
                              BSTR bstr;
                              spHtmlElement->get_outerHTML(&bstr);
                              strResult += "\r\nHTML source of this page is:\r\n\r\n" + 
                                                  CString(bstr) + "\r\n\r\n\r\n";
                         }
                    }
               }
          }
     }

     // освобождаем IShellWindows
     m_spSHWinds.Release();

     return  strResult;
}


Для того, чтобы заменить HTML-код на наш текст во всех окнах с каким-то URL-адресом, добавляем после строки:
Код
   strResult += "\r\nHTML source of this page is:\r\n\r\n" + 
       CString(bstr) + "\r\n\r\n\r\n";

следующее:
Код
   if(CString(strURL) == "about:blank")
   {
      CString csNewText = "<body><br><br><br><br><br><br><table width=60% height=30% align=center style=\"border: 3px double #c0c0c0; background-color: #f0f0f0; font-family: MS Sans Serif; font-weight: bolder; font-size: xx-small\"><tr><td width=100% height=100% align=center valign=center>Винград - самый рульный форум !!!</td></tr></table></body>";

      BSTR bstr = csNewText.AllocSysString();
      spHtmlElement->put_innerHTML(bstr);
   }

и функция InternetExplorerHook() заменит содержимое всех окон, где URL - about:blank, на табличку с указанием какой форум самый рульный !


Список всех действий, которые можно выполнить над IE, можно найти в MSDN (ключевые слова - IWebBrowser2, IHTMLDocument). Данные смарт-указатели (MSHTML::IHTMLDocument2Ptr и другие) позволяют получив интерфейс дочерних элементов, пройтись по всей иерархии объектов IE, например по всем элементам тега < form >, а также работать с JavaScript и т.п.  В примере с codeguru.com (см. линк выше) также описан способ "прослушки" событий IE - таких как создание и закрытие нового окна IE, с помощью event sink. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)