По умолчанию элемент управления WinForms WebBrowser
не предоставляет такого события. Но контроль действительно могучий, поэтому с некоторыми трюками вы можете реализовать свое желаемое поведение: вы уже обнаружили, что вы можете получить доступ к дереву DOM с помощью свойства Document
, но вы также можете общаться со сценариями, запущенными в WebBrowser, как с помощью ObjectForScripting
и метод Document.InvokeScript
. Поскольку Javascript «Vanilla» может прослушивать изменения дерева DOM, вы можете создать скрипт, который регистрирует такие изменения и перенаправляет их в приложение, на котором размещен ваш элемент управления WebBrowser
.
Небольшой класс ниже является примером того, как это может работать, конечно, вы можете изменить слушателя Javascript для получения более специализированных событий.
[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
[ComVisibleAttribute(true)]
public class DOMListener
{
public event Action DOMChanged;
private WebBrowser Browser;
public DOMListener(WebBrowser webbrowser)
{
this.Browser = webbrowser;
this.Browser.ObjectForScripting = this;
this.Browser.DocumentCompleted += OnDOMLoaded;
}
private void OnDOMLoaded(object sender, WebBrowserDocumentCompletedEventArgs e)
{
HtmlElement script = this.Browser.Document.CreateElement("script");
script.InnerHtml = "function listenToDOM() { document.addEventListener('DOMSubtreeModified', function(e) { window.external.DOMUpdate() }); }";
this.Browser.Document.GetElementsByTagName("body")[0].AppendChild(script);
this.Browser.Document.InvokeScript("listenToDOM");
}
public void DOMUpdate()
{
if (this.DOMChanged != null) this.DOMChanged.Invoke();
}
}
Просто создать экземпляр этого класса с WebBrowser в качестве аргумента, и вы будете иметь возможность получить DOM изменения дерева через DOMChanged
событие:
private DOMListener Listener;
public Form1()
{
this.InitializeComponent();
this.Listener = new DOMListener(this.WebBrowser);
this.Listener.DOMChanged += this.OnDOMChanged;
this.WebBrowser.Navigate("www.google.de");
}
void OnDOMChanged()
{
Console.WriteLine(DateTime.Now.ToLongTimeString() + ": DOM changed");
}
Зачем вам такое событие? –
Для этого события нет. – Equalsk