デフォルトでは、WinForms WebBrowser
コントロールはそのようなイベントを提供しません。 しかし、コントロールは非常に強力なので、いくつかのトリックであなたは望ましい動作を実装することができます:Document
プロパティを介してDOMツリーにアクセスできますが、Webブラウザで実行されているスクリプトとObjectForScripting
プロパティと方法Document.InvokeScript
。 'Vanilla' Javascriptは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();
}
}
ちょうど引数として、あなたのWebブラウザーを使用して、このクラスのインスタンスを作成しますDOMChanged
イベントを経由して、DOMツリーの変更を受けることができるようになります:
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