Вот, нашёл способ и спешу поделиться со всеми, как достать HTML-исходник открытой веб-страницы и вообще заставить IE делать что угодно - вплоть до написания Anti-Popup приложения .
Step, RAN, neutrino, как вы думаете - стоит добавлять тему в FAQ или нет ?..
Всё что нужно - это: 1) добавить в начало программы CoInitialize(0); или AfxOleInit(); 2) в исходнике, там где нужно получить текст из окна IE, написать:
Цитата | // самое начало файла #pragma warning(disable : 4192) #pragma warning(disable : 4146) #import <mshtml.tlb> // Internet Explorer 5 #import <shdocvw.dll>
// ...........
// функция получает 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) { MSHTML::IHTMLDocument2Ptr spHtmlDocument(spDisp); MSHTML::IHTMLElementPtr 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; } | |