C# WebBrowser - такой простой и такой сложный. Часть 3
На днях столкнулся с еще несколькими вопросами & проблемами, связанных с WebBrowser.
Как обработать событие, когда пользователь скролит WebBrowser
По сути, необходимо события аля onscroll, которого в WebBrowser попросту нет. Но это событие присутствует на более низком DOM уровне.
Вот этот код позволяет выводить сообщение, когда пользователь скролит WebBrowser:
{ webBrowser1.Navigate("some_url_string"); while (webBrowser1.ReadyState != WebBrowserReadyState.Complete) { Application.DoEvents(); } IHTMLDocument2 doc = (IHTMLDocument2)webBrowser1.Document.DomDocument; IHTMLWindow2 wnd = (IHTMLWindow2)doc.parentWindow; var ievents3 = (HTMLWindowEvents2_Event)wnd; ievents3.onscroll += new HTMLWindowEvents2_onscrollEventHandler (ievents3_onscroll); } void ievents3_onscroll(IHTMLEventObj pEvtObj) { MessageBox.Show("scroll2"); }
Как проскролить WebBrowser программно?
Для работы со скролом есть несколько методов и свойств, а именно:
webBrowser1.Document.Body.ScrollIntoView(true) // позволяет проскролить в самый верх webBrowser1.Document.Body.ScrollIntoView(false) // позволяет проскролить в самый низ webBrowser1.Document.Body.ScrollLeft = 100; // устанавливает смещение влево webBrowser1.Document.Body.ScrollTop = 100; // устанавливает смещение вверх var rect = webBrowser1.Document.Body.ScrollRectangle; // возвращает текущую позицию
Как установить DocumentText программно
Другими словами, каким образом можно обойтись без использования метода Navigate() и установить значение DocumentText из строки.
Такой подход работать не будет:
webBrowser1 = new WebBrowser(); webBrowser1.DocumentText = html; var text = webBrowser1.DocumentText; // text != html
Причина в том, что свойство Document должно быть инициализировано, например вот так:
webBrowser1 = new WebBrowser(); webBrowser1.Navigate("about:blank"); webBrowser1.DocumentText = html; var text = webBrowser1.DocumentText; // text == html
Еще одним способом является использование такого кода:
webBrowser1 = new WebBrowser(); HtmlDocument doc = webBrowser1.Document; doc.Write(String.Empty); webBrowser1.DocumentText = html; var text = webBrowser1.DocumentText; // text == html
Оговорюсь, что встречал стучаи, когда эти примеры не работают, в таком случае нужно комбинировать либо искать причину в другом месте.
Как выполнить JavaScript программно?
Внедряем JavaScript код в страницу и выполняем его таким образом:
HtmlElement head = webBrowser1.Document.GetElementsByTagName("head")[0]; HtmlElement scriptEl = webBrowser1.Document.CreateElement("script"); IHTMLScriptElement element = (IHTMLScriptElement)scriptEl.DomElement; element.text = "function sayHello() { alert('hello!') }"; head.AppendChild(scriptEl); webBrowser1.Document.InvokeScript("sayHello");
По этой теме на сегодня все.