Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как получить HTML-код из окна Internet Explorer... 
:(
    Опции темы
chipset
Дата 28.2.2005, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



 Используется код, взятый с 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. 


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0618 ]   [ Использовано запросов: 23 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.