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; } } } }