ブラウザ/HTMLイベント処理
ブラウザを操作した時やWebページを操作した時には色々なイベントが発生していますが、 それをC#/VBのイベントハンドラで処理することができます。
ブラウザで発生したイベントを処理する
ブラウザではページ表示時に読み込みが完了(DocumentCompleted)イベントなどの様々なイベントが発生しています。
これら発生時にC#/VBで処理できるようにイベントハンドラを追加します。
InternetExplorer操作時
VBの場合、以下のように画面操作でイベントハンドラを追加するか、AddHandlerを使って動的に追加します。
C#の場合は動的にイベントハンドラを追加します。
Public Class BrowserEventIE 'IEの変数宣言にはWithEventsをつけること Private WithEvents objIE As New SHDocVw.InternetExplorer() Private Sub BrowserEventIE_Load(sender As Object, e As EventArgs) Handles MyBase.Load '動的に追加する場合は、各メソッド末尾のHandlesは定義せず、AddHandlerで追加します。 'AddHandler objIE.DocumentComplete, AddressOf DocumentComplete End Sub Private Sub objIE_WebWorkerStarted(dwUniqueID As UInteger, bstrWorkerLabel As String) Handles objIE.WebWorkerStarted Console.WriteLine("WebWorkerStarted") End Sub Private Sub objIE_BeforeNavigate2(pDisp As Object, ByRef URL As Object, ByRef Flags As Object, ByRef TargetFrameName As Object, ByRef PostData As Object, ByRef Headers As Object, ByRef Cancel As Boolean) Handles objIE.BeforeNavigate2 Console.WriteLine("BeforeNavigate2") End Sub Private Sub objIE_BeforeScriptExecute(pDispWindow As Object) Handles objIE.BeforeScriptExecute Console.WriteLine("BeforeScriptExecute") End Sub Private Sub objIE_DocumentComplete(pDisp As Object, ByRef URL As Object) Handles objIE.DocumentComplete Console.WriteLine("DocumentComplete") End Sub Private Sub objIE_NavigateComplete2(pDisp As Object, ByRef URL As Object) Handles objIE.NavigateComplete2 Console.WriteLine("NavigateComplete2") End Sub Private Sub objIE_DownloadBegin() Handles objIE.DownloadBegin Console.WriteLine("DownloadBegin") End Sub Private Sub objIE_DownloadComplete() Handles objIE.DownloadComplete Console.WriteLine("DownloadComplete") End Sub Private Sub objIE_FileDownload(ActiveDocument As Boolean, ByRef Cancel As Boolean) Handles objIE.FileDownload Console.WriteLine("FileDownload") End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click objIE.Navigate("https://www.google.co.jp") objIE.Visible = True End Sub End Class
public partial class Form2 : Form { private SHDocVw.InternetExplorer objIE = new SHDocVw.InternetExplorer(); public BrowserEventIE() { InitializeComponent(); } private void Form2_Load(object sender, System.EventArgs e) { //各イベントハンドラを定義します。 objIE.WebWorkerStarted += new SHDocVw.DWebBrowserEvents2_WebWorkerStartedEventHandler(this.WebWorkerStarted); objIE.BeforeNavigate2 += new SHDocVw.DWebBrowserEvents2_BeforeNavigate2EventHandler(this.BeforeNavigate2); objIE.BeforeScriptExecute += new SHDocVw.DWebBrowserEvents2_BeforeScriptExecuteEventHandler(this.BeforeScriptExecute); objIE.DocumentComplete += new SHDocVw.DWebBrowserEvents2_DocumentCompleteEventHandler(this.DocumentComplete); objIE.NavigateComplete2 += new SHDocVw.DWebBrowserEvents2_NavigateComplete2EventHandler(this.NavigateComplete2); objIE.DownloadBegin += new SHDocVw.DWebBrowserEvents2_DownloadBeginEventHandler(this.DownloadBegin); objIE.DownloadComplete += new SHDocVw.DWebBrowserEvents2_DownloadCompleteEventHandler(this.DownloadComplete); objIE.FileDownload += new SHDocVw.DWebBrowserEvents2_FileDownloadEventHandler(this.FileDownload); } public void WebWorkerStarted(uint dwUniqueID, string bstrWorkerLabel) { Console.WriteLine("WebWorkerStarted"); } public void BeforeNavigate2(object pDisp, ref object URL, ref object Flags, ref object TargetFrameName, ref object PostData, ref object Headers, ref bool Cancel) { Console.WriteLine("BeforeNavigate2"); } public void BeforeScriptExecute(object pDispWindow) { Console.WriteLine("BeforeScriptExecute"); } public void DocumentComplete(object pDisp, ref object e) { Console.WriteLine("DocumentComplete"); } public void NavigateComplete2(object pDisp, ref object e) { Console.WriteLine("NavigateComplete2"); } public void DownloadBegin() { Console.WriteLine("DownloadBegin"); } public void DownloadComplete() { Console.WriteLine("DownloadComplete"); } public void FileDownload(bool ActiveDocument, ref bool Cancel) { Console.WriteLine("FileDownload"); } private void Form2_FormClosed(object sender, FormClosedEventArgs e) { objIE.WebWorkerStarted -= new SHDocVw.DWebBrowserEvents2_WebWorkerStartedEventHandler(this.WebWorkerStarted); objIE.BeforeNavigate2 -= new SHDocVw.DWebBrowserEvents2_BeforeNavigate2EventHandler(this.BeforeNavigate2); objIE.BeforeScriptExecute -= new SHDocVw.DWebBrowserEvents2_BeforeScriptExecuteEventHandler(this.BeforeScriptExecute); objIE.DocumentComplete -= new SHDocVw.DWebBrowserEvents2_DocumentCompleteEventHandler(this.DocumentComplete); objIE.NavigateComplete2 -= new SHDocVw.DWebBrowserEvents2_NavigateComplete2EventHandler(this.NavigateComplete2); objIE.DownloadBegin -= new SHDocVw.DWebBrowserEvents2_DownloadBeginEventHandler(this.DownloadBegin); objIE.DownloadComplete -= new SHDocVw.DWebBrowserEvents2_DownloadCompleteEventHandler(this.DownloadComplete); objIE.FileDownload -= new SHDocVw.DWebBrowserEvents2_FileDownloadEventHandler(this.FileDownload); } private void button1_Click(object sender, EventArgs e) { objIE.Navigate("https://www.google.co.jp"); objIE.Visible = true; } }
WebBrowserコントロール使用時
以下のようにデザイナでWebBroserのプロパティからイベントハンドラを追加できます。
または動的にイベントハンドラを追加します。
Public Class BrowserEventWB Private Sub BrowserEventWB_Load(sender As Object, e As EventArgs) Handles MyBase.Load WebBrowser1.ScriptErrorsSuppressed = True '動的に追加する場合は、各メソッド末尾のHandlesは定義せず、AddHandlerで追加します。 'AddHandler WebBrowser1.DocumentCompleted, AddressOf WebBrowser1_DocumentCompleted End Sub Private Sub WebBrowser1_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted Console.WriteLine("DocumentCompleted") End Sub Private Sub WebBrowser1_FileDownload(sender As Object, e As EventArgs) Handles WebBrowser1.FileDownload Console.WriteLine("FileDownload") End Sub Private Sub WebBrowser1_Navigating(sender As Object, e As WebBrowserNavigatingEventArgs) Handles WebBrowser1.Navigating Console.WriteLine("Navigating") End Sub Private Sub WebBrowser1_Navigated(sender As Object, e As WebBrowserNavigatedEventArgs) Handles WebBrowser1.Navigated Console.WriteLine("Navigated") End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click WebBrowser1.Navigate("https://web.biz-prog.net/") End Sub End Class
public partial class BrowserEventWB : Form { public BrowserEventWB() { InitializeComponent(); } private void BrowserEventWB_Load(object sender, EventArgs e) { webBrowser1.ScriptErrorsSuppressed = true; //動的に追加する場合は以下のようにします。 //this.webBrowser1.DocumentCompleted += new System.Windows.Forms.WebBrowserDocumentCompletedEventHandler(this.webBrowser1_DocumentCompleted); //this.webBrowser1.FileDownload += new System.EventHandler(this.webBrowser1_FileDownload); //this.webBrowser1.Navigated += new System.Windows.Forms.WebBrowserNavigatedEventHandler(this.webBrowser1_Navigated); //this.webBrowser1.Navigating += new System.Windows.Forms.WebBrowserNavigatingEventHandler(this.webBrowser1_Navigating); } private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { Console.WriteLine("DocumentCompleted"); } private void webBrowser1_Navigated(object sender, WebBrowserNavigatedEventArgs e) { Console.WriteLine("Navigated"); } private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e) { Console.WriteLine("Navigating"); } private void webBrowser1_FileDownload(object sender, EventArgs e) { Console.WriteLine("FileDownload"); } private void button1_Click(object sender, EventArgs e) { webBrowser1.Navigate("https://web.biz-prog.net/"); } }
WebView2コントロール使用時
以下のようにデザイナでWebView2のプロパティからイベントハンドラを追加できます。
または動的にイベントハンドラを追加します。
Public Class BrowserEventWV Private Sub BrowserEventWV_Load(sender As Object, e As EventArgs) Handles MyBase.Load InitializeAsync() '動的に追加する場合は、各メソッド末尾のHandlesは定義せず、AddHandlerで追加します。 'AddHandler WebView2.NavigationCompleted, AddressOf WebView2_NavigationCompleted End Sub Private Async Sub InitializeAsync() Await WebView2.EnsureCoreWebView2Async(Nothing) End Sub Private Sub WebView2_NavigationCompleted(sender As Object, e As Microsoft.Web.WebView2.Core.CoreWebView2NavigationCompletedEventArgs) Handles WebView2.NavigationCompleted Console.WriteLine("NavigationCompleted") End Sub Private Sub WebView2_NavigationStarting(sender As Object, e As Microsoft.Web.WebView2.Core.CoreWebView2NavigationStartingEventArgs) Handles WebView2.NavigationStarting Console.WriteLine("NavigationStarting") End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click WebView2.CoreWebView2.Navigate("https://web.biz-prog.net/") End Sub End Class
public partial class BrowserEventWV : Form { public BrowserEventWV() { InitializeComponent(); InitializeAsync(); } async void InitializeAsync() { await webView2.EnsureCoreWebView2Async(null); } private void BrowserEventWV_Load(object sender, EventArgs e) { //動的に追加する場合は以下のようにします。 this.webView2.NavigationStarting += new System.EventHandler<Microsoft.Web.WebView2.Core.CoreWebView2NavigationStartingEventArgs>(this.webView2_NavigationStarting); this.webView2.NavigationCompleted += new System.EventHandler<Microsoft.Web.WebView2.Core.CoreWebView2NavigationCompletedEventArgs>(this.webView2_NavigationCompleted); } private void webView2_NavigationCompleted(object sender, Microsoft.Web.WebView2.Core.CoreWebView2NavigationCompletedEventArgs e) { Console.WriteLine("NavigationCompleted"); } private void webView2_NavigationStarting(object sender, Microsoft.Web.WebView2.Core.CoreWebView2NavigationStartingEventArgs e) { Console.WriteLine("NavigationStarting"); } private void button1_Click(object sender, EventArgs e) { webView2.CoreWebView2.Navigate("https://web.biz-prog.net/"); } }
HTML要素で発生したイベントを処理する
Webページ内で操作を行ってイベントが発生した場合に、C#/VBで処理できるようにイベントハンドラを追加します。
InternetExplorer操作はうまくいってないのでサンプルはありません。
WebBrowserコントロール使用時
AttachEventHandlerメソッドによりイベントハンドラーを追加します。
ドキュメントの読み込みが完了したDocumentCompletedイベント発生後に本メソッドを使用してください。
以下のサンプルでは、DocumentCompletedイベント後に、Documentと要素にイベントハンドラを追加してます。
Documentには、マウス移動した際にカーソルがある要素の情報を取得して表示するイベントハンドラを追加しています。
要素には、クリック時にメッセージを表示するイベントハンドラを追加しています。
Public Class ElementEventWB Private Sub ElementEventWB_Load(sender As Object, e As EventArgs) Handles MyBase.Load WebBrowser1.ScriptErrorsSuppressed = True End Sub Private Sub WebBrowser1_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted 'ページのドキュメントにイベントハンドラを追加する AddHandler WebBrowser1.Document.MouseOver, AddressOf Document_MouseOver '要素にイベントハンドラを追加する Dim elem As HtmlElement = WebBrowser1.Document.GetElementById("inputid1") If elem <> Nothing Then elem.AttachEventHandler("onclick", AddressOf Element_Click) End If End Sub 'マウスの座標上にあるエレメントを取得する Private Sub Document_MouseOver(sender As Object, e As HtmlElementEventArgs) Dim elem As HtmlElement = WebBrowser1.Document.GetElementFromPoint(e.MousePosition) Label1.Text = elem.TagName & "," & elem.Id & "," & elem.Name End Sub '要素のクリック時に動作する Private Sub Element_Click(sender As Object, e As EventArgs) MsgBox("click") End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click WebBrowser1.Navigate("https://web.biz-prog.net/test/testpage.html") End Sub End Class
public partial class ElementEventWB : Form { public ElementEventWB() { InitializeComponent(); } private void ElementEventWB_Load(object sender, EventArgs e) { webBrowser1.ScriptErrorsSuppressed = true; //ページ読み込み完了のイベントハンドラを追加する this.webBrowser1.DocumentCompleted += new System.Windows.Forms.WebBrowserDocumentCompletedEventHandler(this.webBrowser1_DocumentCompleted); } //ページの読み込み完了後に要素のイベントハンドラを追加する private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { //ページのドキュメントにイベントハンドラを追加する webBrowser1.Document.MouseOver += new HtmlElementEventHandler(Document_MouseOver); //要素にイベントハンドラを追加する HtmlElement elem = webBrowser1.Document.GetElementById("inputid1"); if(elem != null) { elem.AttachEventHandler("onclick", Element_Click); } } //マウスの座標上にあるエレメントを取得する void Document_MouseOver(object sender, HtmlElementEventArgs e) { HtmlElement elem = webBrowser1.Document.GetElementFromPoint(e.MousePosition); if (elem == null) return; label1.Text = elem.TagName + "," + elem.Id + "," + elem.Name; } //要素のクリック時に動作する private void Element_Click(object sender, EventArgs e) { MessageBox.Show("click"); } private void button1_Click(object sender, EventArgs e) { webBrowser1.Navigate("https://web.biz-prog.net/test/testpage.html"); } }