WebView2 応用テクニック
独自のコンテキストメニューを表示する
WebView2コントロール上で右クリックするとブラウザのコンテキストメニューが表示されますが、
これを独自のコンテキストメニューに変更します。

方法
画面にコンテキストメニューを貼り付け、メニュー内容を作成します。

CoreWebView2InitializationCompletedイベントにて初期設定を行います。
WebView2コントロールのコンテキストメニューを「表示しない」設定を行います。
//C#書式
webView2.CoreWebView2.Settings.AreDefaultContextMenusEnabled = false;
webView2.CoreWebView2.Settings.AreDefaultContextMenusEnabled = false;
JavaScriptにより、Webページでコンテキストメニュー表示のイベントが発生した場合に、
.NET側にメッセージで通知します。
クリックした座標情報も一緒に送ります。
また、コンテキストメニュー表示時に他の場所をクリックした場合に閉じれるように、
マウスダウンイベントでもメッセージを送るようにします。
//JavaScript書式
document.addEventListener('mousedown', function (event)
{
window.chrome.webview.postMessage('mousedown');
});
document.addEventListener('contextmenu', function (event)
{
window.chrome.webview.postMessage('contextmenu,' + event.screenX + ',' + event.screenY);
});
document.addEventListener('mousedown', function (event)
{
window.chrome.webview.postMessage('mousedown');
});
document.addEventListener('contextmenu', function (event)
{
window.chrome.webview.postMessage('contextmenu,' + event.screenX + ',' + event.screenY);
});
AddScriptToExecuteOnDocumentCreatedAsyncメソッドでJavaScriptのコードをWebページに追加します。
JavaScriptからのメッセージを.NET側で受け取り、コンテキストメニューを表示します。
受信したメッセージを判断して、
contextmenuであればcontextMenuStripを座標の位置に表示させます。
mousedownであればcontextMenuStripを非表示にします。
サンプル
Public Class OridinalContextMenu
Private Sub OridinalContextMenu_Load(sender As Object, e As EventArgs) Handles MyBase.Load
InitializeAsync()
End Sub
Private Async Sub InitializeAsync()
Await webView2.EnsureCoreWebView2Async(Nothing)
End Sub
Private Sub webView2_CoreWebView2InitializationCompleted(sender As Object, e As Microsoft.Web.WebView2.Core.CoreWebView2InitializationCompletedEventArgs) Handles webView2.CoreWebView2InitializationCompleted
'ブラウザのコンテキストメニューを非表示に設定
webView2.CoreWebView2.Settings.AreDefaultContextMenusEnabled = False
'JavaScriptにて、mousedownイベントとcontextmenuイベント発生時に.NETにメッセージを送る
Dim js = New System.Text.StringBuilder()
js.AppendLine("document.addEventListener('mousedown', function (event)")
js.AppendLine("{")
js.AppendLine(" window.chrome.webview.postMessage('mousedown');")
js.AppendLine("});")
js.AppendLine("document.addEventListener('contextmenu', function (event)")
js.AppendLine("{")
js.AppendLine(" window.chrome.webview.postMessage('contextmenu,' + event.screenX + ',' + event.screenY);")
js.AppendLine("});")
'JavaScriptコードをWebページに追加する
webView2.CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync(js.ToString())
End Sub
Private Sub button1_Click(sender As Object, e As EventArgs) Handles button1.Click
If webView2.CoreWebView2 Is Nothing Then Return
webView2.CoreWebView2.Navigate("https://web.biz-prog.net/test/testpage.html")
End Sub
Private Sub webView2_WebMessageReceived(sender As Object, e As Microsoft.Web.WebView2.Core.CoreWebView2WebMessageReceivedEventArgs) Handles webView2.WebMessageReceived
Dim message As String() = e.TryGetWebMessageAsString().Split(",")
Select Case message(0)
Case "mousedown"
ContextMenuStrip1.Hide()
Case "contextmenu"
ContextMenuStrip1.Show(New Point(Integer.Parse(message(1)), Integer.Parse(message(2))))
End Select
End Sub
End Class
public partial class OridinalContextMenu : Form
{
public OridinalContextMenu()
{
InitializeComponent();
}
private void OridinalContextMenu_Load(object sender, EventArgs e)
{
InitializeAsync();
}
async void InitializeAsync()
{
await webView2.EnsureCoreWebView2Async(null);
}
private void webView2_CoreWebView2InitializationCompleted(object sender, Microsoft.Web.WebView2.Core.CoreWebView2InitializationCompletedEventArgs e)
{
//ブラウザのコンテキストメニューを非表示に設定
webView2.CoreWebView2.Settings.AreDefaultContextMenusEnabled = false;
//JavaScriptにて、mousedownイベントとcontextmenuイベント発生時に.NETにメッセージを送る
var js = new System.Text.StringBuilder();
js.AppendLine("document.addEventListener('mousedown', function (event)");
js.AppendLine("{");
js.AppendLine(" window.chrome.webview.postMessage('mousedown');");
js.AppendLine("});");
js.AppendLine("document.addEventListener('contextmenu', function (event)");
js.AppendLine("{");
js.AppendLine(" window.chrome.webview.postMessage('contextmenu,' + event.screenX + ',' + event.screenY);");
js.AppendLine("});");
//JavaScriptコードをWebページに追加する
webView2.CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync(js.ToString());
}
private void button1_Click(object sender, EventArgs e)
{
if (webView2.CoreWebView2 == null) return;
webView2.CoreWebView2.Navigate("https://web.biz-prog.net/test/testpage.html");
}
private void webView2_WebMessageReceived(object sender, Microsoft.Web.WebView2.Core.CoreWebView2WebMessageReceivedEventArgs e)
{
string[] message = e.TryGetWebMessageAsString().Split(',');
switch (message[0])
{
case "mousedown":
contextMenuStrip1.Hide();
break;
case "contextmenu":
contextMenuStrip1.Show(new Point(int.Parse(message[1]), int.Parse(message[2])));
break;
}
}
}
参考
