c# - 如何检测 webview2 中的鼠标点击(c#/vb.net)
问题描述
我尝试获取 html 元素的事件点击。使用我使用的 WebBrowser:
instance = Nothing
instance = WebBrowser1.Document
AddHandler instance.Click, AddressOf Document_Click
但是对于 Webview2,我没有找到好的做法。我必须注入一个javascript代码吗?但是,我如何在 C# 或 Vb.net 应用程序中获取处理程序?
非常感谢。
这里有一个示例代码。我的函数中没有返回:WebView1_WebMessageReceived。为什么 ?我想,我忘记了什么……
Imports System.IO
Imports Microsoft.Web.WebView2.Core
Imports Newtonsoft.Json
Class MainWindow
Public Sub New()
InitializeComponent()
InitializeSyncroComponent()
' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
End Sub
Structure JsonObject
Public Key As String
'Public Value As PointF
End Structure
Async Sub InitializeSyncroComponent()
Await webview1.EnsureCoreWebView2Async
webview1.CoreWebView2.Navigate("https://google.fr/")
End Sub
Private Sub WebView1_WebMessageReceived(ByVal sender As Object, ByVal e As Microsoft.Web.WebView2.Core.CoreWebView2WebMessageReceivedEventArgs)
Dim jsonObject As JsonObject = JsonConvert.DeserializeObject(Of JsonObject)(e.WebMessageAsJson)
Select Case jsonObject.Key
Case "contextmenu"
'contextMenuStrip1.Show(Point.Truncate(jsonObject.Value))
Case "mousedown"
Stop
' contextMenuStrip1.Hide()
End Select
End Sub
Private Sub webview1_NavigationCompleted(sender As Object, e As CoreWebView2NavigationCompletedEventArgs) Handles webview1.NavigationCompleted
webview1.CoreWebView2.Settings.AreDefaultContextMenusEnabled = False
Dim script As String = File.ReadAllText("d:\test_mouse.js")
webview1.CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync(script)
End Sub
End Class
脚本Java:
document.addEventListener('mousedown', function (event)
{
let jsonObject =
{
Key: 'mousedown',
Value:
{
X: event.screenX,
Y: event.screenY
}
};
window.chrome.webview.postMessage(jsonObject);
});
编辑:我发现我的错误......真的不多!
我忘记了 webview 属性中 WebMessageReceived 的声明。
解决方案
好的,我不知道 VB.Net,但你似乎能够翻译 C# 代码,所以我将尝试在 C# 中创建一个简单的工作解决方案:
首先,从 Nuget 下载Microsoft.Web.WebView2
并Newtonsoft.Json
安装到您的项目中(您可能已经这样做了)。
现在将其WebView2
放在表单上 - 然后在 Property Inspector 中:
将源设置为:'https://google.fr/'
双击
CoreWebView2InitializationCompleted
和WebMessageReceived
事件在您的代码中创建骨架。
现在将此代码添加到 VB.Net:
using Microsoft.Web.WebView2.Core;
using Newtonsoft.Json;
using System.IO;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public struct JsonObject
{
public string Key;
public string Value;
}
private async void WebView21_CoreWebView2InitializationCompleted(object sender, CoreWebView2InitializationCompletedEventArgs e)
{
string script = File.ReadAllText("Mouse.js");
await webView21.CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync(script);
}
private void WebView21_WebMessageReceived(object sender, CoreWebView2WebMessageReceivedEventArgs e)
{
JsonObject jsonObject = JsonConvert.DeserializeObject<JsonObject>(e.WebMessageAsJson);
switch (jsonObject.Key)
{
case "click":
MessageBox.Show(jsonObject.Value);
break;
}
}
}
}
现在在您的项目目录中创建一个 javascript 文件(“Mouse.js”),选择该文件并在 Property Inspector 中选择Copy to output directory并选择:Copy if newer
。这意味着,您的 VB 程序可以使用相对链接找到您的 javascript 文件。
现在将以下 javascript 粘贴到文件中:
document.addEventListener('click', function (event)
{
let elem = event.target;
let jsonObject =
{
Key: 'click',
Value: elem.name || elem.id || elem.tagName || "Unkown"
};
window.chrome.webview.postMessage(jsonObject);
});
现在,当您运行它时,您应该会看到一个消息框,其中显示Name
或ID
您Tag Name
单击的元素(按该顺序)。
我使用这种Key: 'click'
方法的原因是,当您稍后想要检测时,MouseDown
您可以轻松添加该键 - 然后您可以检测到两者(否则您只能检测到一种事件)。
更新:
CoreWebView2Ready
将事件更改为CoreWebView2InitializationCompleted
。这是该活动的新名称。它CoreWebView2InitializationCompletedEventArgs
用作 eventArgs。
推荐阅读
- google-bigquery - 使用 google 工作流执行 BigQuery 以获取表的最后修改。在工作流程中得到错误的结果,但在 BIGQUERY UI 中同样可以正常工作
- javascript - 如何获得自动归档的输入值?
- c# - 根据时区在 C# 中设置日期时间,例如 +08:00
- javascript - 如何从反应原生的html代码中获取youtube url
- laravel - 使用 htaccess 或 routes.php 重定向 301 单个 URL
- sass - 如何在同级导入中访问使用 @use 方法导入的变量
- reactjs - 为什么在反应本机应用程序中按下每个键后键盘都会消失
- mysql - 尝试在我的 Lambda 中创建数据库时,为什么会出现 TCP/IP 错误?
- kubernetes - openshift 服务如何在 pod 之间进行负载均衡?
- json - 如何处理 Alamofire 响应并在不同视图中重用