Предыдущий пост -
Следующий пост -

Работа с WebBrowser в visual studio 2010

Рубрика: MFC, Дата: 17 August, 2015, Автор:

Здорова в этом посте разберем по пунктам как работать в Webbrowser. И так начнем с подключения.

1. Подключение Webbrowser к проекту

Создаем обычное диалоговое приложение Visual studio. Дальше к файлу нашего диалога подключаем с помощью директивы #import файл ieframe.dll примерно так

#import "C:\\Windows\\System32\\ieframe.dll" rename_namespace("ddd")

Это создаст в директории Debug или Release два файла которые подключаются к проекту сами tlh и thi, в tlh заголовки и всякая фигня, а в tli определения функций. Мы специально для этих функции сделали свое пространство имен с названием ddd

Все мы подключили. Теперь нам нужно определить переменную CWnd m_wndBrowser; это указатель на окошко, его нужно определить где то в классе диалога как член.

Если вы определите эту переменную в какой то функции, то и сделаете инициализацию, то по завершению этой функции переменная CWnd уничтожится, поэтому нужно создавать эту переменную как член диалога. Я вообще не опытный долго не мог понять почему у меня окно браузера не отображается, а все потому что CWnd была определена локально 🙂 .
и также добавим указатель на интерфейс ddd::IWebBrowserPtr m_brows;

public:
	CWnd m_wndBrowser;
	ddd::IWebBrowserPtr m_brows;

и дальше где то например в какой нибудь обработчике кнопки добавим следующий код

Ctest_brawser22Dlg::OnBnClickedButton1 »

void Ctest_brawser22Dlg::OnBnClickedButton1()
{
	// TODO: добавьте свой код обработчика уведомлений
//	wnd=GetSafeHwnd();
	CRect rectClient(10,10,500,500);
	
	
	if (!m_wndBrowser.CreateControl(__uuidof(ddd::WebBrowser), _T("Window"),
	 WS_VISIBLE | WS_CHILD, rectClient, this, AFX_IDW_PANE_FIRST))
	{
		DestroyWindow();
	}
	if (m_brows = m_wndBrowser.GetControlUnknown())
	{
		ddd::IWebBrowser2* pTr;
		m_brows->QueryInterface(__uuidof(ddd::IWebBrowser2),(void**)&pTr);
		BSTR url=L"microsoft.com";
		pTr->Navigate2(COleVariant(url),NULL,NULL,NULL,NULL);
		TRACE("bifore if url=%Sn",url);
	}	
}

и у вас в диалоге отобразится окошко браузера с загруженой страницей сайта microsoft.com

mfc webbrowser

2. Удаление cookies в Webbrowser

Код удаляет журнал IE и очищаются cookies

void Ctest_fl_ruDlg::OnBnClickedLogout()
{
    // TODO: добавьте свой код обработчика уведомлений
    if(AfxMessageBox(L"Будет удален полностью журнал IE! :) Хотите его удалить?",MB_OKCANCEL)==IDOK)
    {
        m_pWeb2->Stop();
        if(InternetSetOption(NULL, INTERNET_OPTION_END_BROWSER_SESSION, NULL, 0))
        {
            system("cmd.exe /C RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 255");
            AfxMessageBox(L"its ok!");
        }
        else
            AfxMessageBox(L"Not delete!");
        m_pWeb2->Refresh();
    }
}

 3. Изменение прокси в WebBrowser

Как добавить прокси в WebBrowser можите почитать тут.  На MFC мы используем класс CRegKey для редактирования реестра, вот код который добавляет прокси

Показать »

CRegKey key;
if(key.Open(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings")!=ERROR_SUCCESS)
{AfxMessageBox(L"don't open reg key");return;}
if(key.SetDWORDValue(L"MigrateProxy",1)!=ERROR_SUCCESS){AfxMessageBox(L"don't open MigrateProxy");return;}
if(key.SetDWORDValue(L"ProxyEnable",1)!=ERROR_SUCCESS){AfxMessageBox(L"don't open ProxyEnable");return;}
if(key.SetDWORDValue(L"ProxyHttp1.1",0)!=ERROR_SUCCESS){AfxMessageBox(L"don't open ProxyHttp1.1");return;}
if(key.SetStringValue(L"ProxyServer",url)!=ERROR_SUCCESS){AfxMessageBox(L"don't open ProxyServer");return;}
if(key.SetStringValue(L"ProxyOverride",L"<local>")!=ERROR_SUCCESS){AfxMessageBox(L"don't open ProxyOverride");return;}      
key.Close();
InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0);
InternetSetOption(NULL, INTERNET_OPTION_REFRESH , NULL, 0);

А вот код который удаляет вообще прокси

Показать »

CRegKey key;
if(key.Open(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings")!=ERROR_SUCCESS)
{AfxMessageBox(L"don't open reg key");return;}
if(key.SetDWORDValue(L"ProxyEnable",0)!=ERROR_SUCCESS){AfxMessageBox(L"don't open ProxyEnable");return;}
if(key.SetDWORDValue(L"ProxyHttp1.1",1)!=ERROR_SUCCESS){AfxMessageBox(L"don't open ProxyHttp1.1");return;}
key.Close();
InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0);
InternetSetOption(NULL, INTERNET_OPTION_REFRESH , NULL, 0);

строчки

InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0);
InternetSetOption(NULL, INTERNET_OPTION_REFRESH , NULL, 0);

заставляют браузер перезагрузится, прочитать за функцию InternetSetOption можно тут. Прочитать за флаги можно тут.  Все.

3. Очищаем окно браузера

Нужно бывает очистить документ, например мы проверяем удачно ли получилось загрузить или нет и новый документ при изменении например прокси, если его не изменить то получится что удачно все получилось. От доступен прокси и норм загрузил документ, а потом стал недоступен и два или 3 раза мы не дождались ответа, а документ остался старый, то проверка на норм загрузку нам выдаст что все норм, поэтому нужно очищать. Это можно сделать вызвав в navigate строчку “about::bank”. Я пробовал другие способы там типо получить IHTMLElement* body через интерфейс IHTMLDocument2*, но когда я меняю боди, то у меня при вызове Novigate перестает грузится данный сайт. Пробовал через интерфейс IHTMLDocument3 изменить полностью все тело документа, то ничего не получилось, неустанавливался текст. Короче только норм работает “about::bank”.

4. Изменяем браузер с ИЕ7 на ИЕ11 или какой то другой на выбор.

Почитать за то как изменить емуляцию с ИЕ7 на ИЕ11 можно тут. Смысл в том что мы в реестр по по пути HKEY_LOCAL_MACHINE / SOFTWARE / Microsoft / Internet Explorer / Main / FeatureControl / FEATURE_BROWSER_EMULATION

Добавляем новое значение с названием нашей программы и значением для ИЕ11 11001, для ИЕ7 там по умолчанию будет вызывается со значением 7000.

В общем читайте все по ссылке выше, там все предельно ясно написано как что делать.

приведу пока пример как получить название файла

MAX_PATH;
wchar_t buffer[MAX_PATH];
GetModuleFileName(AfxGetInstanceHandle(),buffer,MAX_PATH);
AfxMessageBox(buffer);

Дальше мы его улучшим с добавлением в реестр значения с именем нашего приложения. щас лень 🙂

 

 

 

 

 

 

Комментарии:


Оставить комментарий

Your email address will not be published. Required fields are marked *