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