WebView2 応用テクニック

コンテキストメニューに項目を追加・削除する

WebView2コントロール上で右クリックで表示されるコンテキストメニューの項目を追加または削除する方法です。

実装方法

WebView2コントロールでコンテキストメニューを表示した場合はContextMenuRequestedイベントが発生します。
このContextMenuRequestedイベント発生時にメニュー項目の追加・削除の処理を行うことで、
表示されるコンテキストメニューから項目が追加・削除されます。

項目を追加する場合

ContextMenuRequestedイベント発生時に CoreWebView2ContextMenuItemクラスのオブジェクトを作成し、
項目の表示名や動作を定義して、クリック時の処理を追加します。

						Private Sub webView2_CoreWebView2InitializationCompleted(sender As Object, e As Microsoft.Web.WebView2.Core.CoreWebView2InitializationCompletedEventArgs) Handles webView2.CoreWebView2InitializationCompleted

							'WebView2の初期化完了時に、コンテキストメニュー表示のイベントを定義
							AddHandler webView2.CoreWebView2.ContextMenuRequested, AddressOf ContextMenuRequested
					
						End Sub
						
						Private Sub ContextMenuRequested(sender As Object, args As CoreWebView2ContextMenuRequestedEventArgs)

							Dim menuList As IList(Of CoreWebView2ContextMenuItem) = args.MenuItems
					
							'リストの項目を作成
							Dim newItem As CoreWebView2ContextMenuItem =
											webView2.CoreWebView2.Environment.CreateContextMenuItem("Display Page Uri", Nothing, CoreWebView2ContextMenuItemKind.Command)
					
							'項目クリック時の処理を定義
							AddHandler newItem.CustomItemSelected, Sub(send As Object, ex As Object)
					
																	Dim pageUri As String = args.ContextMenuTarget.PageUri
																	System.Threading.SynchronizationContext.Current.Post(Sub()
																																MessageBox.Show(pageUri, "Page Uri")
																															End Sub, Nothing)
																End Sub
						End Sub
					
						private void wv2_CoreWebView2InitializationCompleted(object sender, CoreWebView2InitializationCompletedEventArgs e)
						{
							//WebView2の初期化完了時に、コンテキストメニュー表示のイベントを定義
							wv2.CoreWebView2.ContextMenuRequested += ContextMenuRequested;
						}

						private void ContextMenuRequested(object sender, CoreWebView2ContextMenuRequestedEventArgs args)
						{
							IList<CoreWebView2ContextMenuItem> menuList = args.MenuItems;
				
							//リストの項目を作成
							CoreWebView2ContextMenuItem newItem =
							                    wv2.CoreWebView2.Environment.CreateContextMenuItem("Display Page Uri", null, CoreWebView2ContextMenuItemKind.Command);
				
							//項目クリック時の処理を定義
							newItem.CustomItemSelected += delegate (object send, Object ex)
							{
							    string pageUri = args.ContextMenuTarget.PageUri;
							    System.Threading.SynchronizationContext.Current.Post((_) =>
							    {
							        MessageBox.Show(pageUri, "Page Uri");
							    }, null);
							};
				
							//リストの最後の部分に追加
							menuList.Insert(menuList.Count, newItem);
						}
					

項目を削除する場合

ContextMenuRequestedイベント発生時に、
引数で渡されたメニュー情報の一覧からインデックス番号や名称で削除対象項目を探し、削除します。

						Private Sub webView2_CoreWebView2InitializationCompleted(sender As Object, e As Microsoft.Web.WebView2.Core.CoreWebView2InitializationCompletedEventArgs) Handles webView2.CoreWebView2InitializationCompleted

							'WebView2の初期化完了時に、コンテキストメニュー表示のイベントを定義
							AddHandler webView2.CoreWebView2.ContextMenuRequested, AddressOf ContextMenuRequested
					
						End Sub
						
						Private Sub ContextMenuRequested(sender As Object, args As CoreWebView2ContextMenuRequestedEventArgs)

							Dim menuList As IList(Of CoreWebView2ContextMenuItem) = args.MenuItems
							Dim context As CoreWebView2ContextMenuTargetKind = args.ContextMenuTarget.Kind
					
							'画像を右クリックした場合
							If context = CoreWebView2ContextMenuTargetKind.Image Then
					
								'メニューから「名前をつけて画像を保存」を削除
								For index As Integer = 0 To index < menuList.Count
					
									If menuList(index).Name = "saveImageAs" Then
					
										menuList.RemoveAt(index)
										Exit For
									End If
								Next
					
								'ページ領域を右クリックした場合
							ElseIf context = CoreWebView2ContextMenuTargetKind.Page Then
					
								'メニューから「印刷」を削除
								For index As Integer = 0 To index < menuList.Count
									If menuList(index).Name = "print" Then
					
										menuList.RemoveAt(index)
										Exit For
									End If
								Next
							End If				
						End Sub
					
						private void wv2_CoreWebView2InitializationCompleted(object sender, CoreWebView2InitializationCompletedEventArgs e)
						{
							//WebView2の初期化完了時に、コンテキストメニュー表示のイベントを定義
							wv2.CoreWebView2.ContextMenuRequested += ContextMenuRequested;
						}

						private void ContextMenuRequested(object sender, CoreWebView2ContextMenuRequestedEventArgs args)
						{
							IList<CoreWebView2ContextMenuItem> menuList = args.MenuItems;
							CoreWebView2ContextMenuTargetKind context = args.ContextMenuTarget.Kind;
				
							//画像を右クリックした場合
							if (context == CoreWebView2ContextMenuTargetKind.Image)
							{
								//メニューから「名前をつけて画像を保存」を削除
								for (int index = 0; index < menuList.Count; index++)
								{
									if (menuList[index].Name == "saveImageAs")
									{
										menuList.RemoveAt(index);
										break;
									}
								}
							}
							//ページ領域を右クリックした場合
							else if (context == CoreWebView2ContextMenuTargetKind.Page)
							{
								//メニューから「印刷」を削除
								for (int index = 0; index < menuList.Count; index++)
								{
									if (menuList[index].Name == "print")
									{
										menuList.RemoveAt(index);
										break;
									}
								}
							}
						}
					

参考