如何覆盖右键单击ContextMenu控件时出现的WebView2?
右键单击WebView2控件时,会出现具有“刷新”、“另存为”等选项的标准上下文菜单。
如何使我自己的ContextMenuStrip出现而不是在鼠标右键单击时出现?
发布于 2020-07-04 17:05:39
Update (现在代码显示右键单击上下文菜单,单击任意位置时隐藏它):
您可以将以下javascript
注入您的网页(它订阅'contextmenu
‘事件和'mousedown
’事件):
document.addEventListener('contextmenu', function (event)
{
let jsonObject =
{
Key: 'contextmenu',
Value:
{
X: event.screenX,
Y: event.screenY
}
};
window.chrome.webview.postMessage(jsonObject);
});
document.addEventListener('mousedown', function (event)
{
let jsonObject =
{
Key: 'mousedown',
Value:
{
X: event.screenX,
Y: event.screenY
}
};
window.chrome.webview.postMessage(jsonObject);
});
在一个文件中保存它是最简单的(我称之为'Javascript1.js')。
要使用'CoreWebView2‘实例,必须初始化WebView2
控件,订阅'CoreWebView2InitializationCompleted’解决了这个问题。
要注入您的javascript,您可以从文件中加载它并使用AddScriptToExecuteOnDocumentCreatedAsync
注入它。
您需要禁用默认上下文菜单。这是通过将AreDefaultContextMenusEnabled
属性设置为false
完成的。
然后,您需要订阅WebMessageReceived
事件并处理这两个事件。为此,创建一个带有“Key”和“Value”的结构,以反序列化从javascript代码发送的JSON字符串。
C#代码,显示带有事件的整个表单:
using Newtonsoft.Json;
using System;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
struct JsonObject
{
public string Key {get; set;}
public PointF Value{get; set;}
private async void WebView21_CoreWebView2InitializationCompleted(object sender, CoreWebView2InitializationCompletedEventArgs e)
{
webView21.CoreWebView2.Settings.AreDefaultContextMenusEnabled = false;
string script = File.ReadAllText(Path.Combine(Environment.CurrentDirectory, @"Javascript1.js"));
await webView21.CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync(script);
}
private void WebView21_WebMessageReceived(object sender, Microsoft.Web.WebView2.Core.CoreWebView2WebMessageReceivedEventArgs e)
{
JsonObject jsonObject = JsonDeserializer.Deserialize<JsonObject>(e.WebMessageAsJson);
switch (jsonObject.Key)
{
case "contextmenu":
contextMenuStrip1.Show(Point.Truncate(jsonObject.Value));
break;
case "mousedown":
contextMenuStrip1.Hide();
break;
}
}
}
}
高级版本可以在这里找到:覆盖Webview2上下文菜单和默认上下文菜单
发布于 2020-06-30 17:22:41
我们还没有完全支持定制上下文菜单,但是我们有跟踪它的特性请求。在过渡期间,您可能可以使用在该特性请求问题中所描述的工作来解决这个问题。
本质上,所做的工作是使用document.body的contextmenu事件来拦截通常的上下文菜单,处理并实现您自己的菜单。可以使用window.chrome.webview.postMessage
将上下文菜单事件发送到本机代码以创建本机上下文菜单,也可以在HTML/JS中实现上下文菜单。
抱歉,这不是一个简单的解决办法。如果您愿意,可以将自己的注释添加到特性请求中,以便让我们了解在WebView2中使用上下文菜单的场景等等。谢谢!
https://stackoverflow.com/questions/62624373
复制相似问题