ブラウザ/HTMLイベント処理

ブラウザを操作した時やWebページを操作した時には色々なイベントが発生していますが、 それをC#/VBのイベントハンドラで処理することができます。

ブラウザで発生したイベントを処理する

ブラウザではページ表示時に読み込みが完了(DocumentCompleted)イベントなどの様々なイベントが発生しています。
これら発生時にC#/VBで処理できるようにイベントハンドラを追加します。

InternetExplorer操作時

VBの場合、以下のように画面操作でイベントハンドラを追加するか、AddHandlerを使って動的に追加します。
VBでイベントハンドラを追加

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のプロパティからイベントハンドラを追加できます。
WebBrowserでイベントハンドラを追加

または動的にイベントハンドラを追加します。

							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のプロパティからイベントハンドラを追加できます。
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");
									}
							
								}
							
	
								
							

参考