Cómo detectar un clic del ratón en webview2 (c#/vb.net)
Intento conseguir los eventos clic en el elemento html. Con un WebBrowser Yo usaba:
instance = Nothing
instance = WebBrowser1.Document
AddHandler instance.Click, AddressOf Document_Click
Pero con Webview2 No encuentro la buena práctica. ¿Debo inyectar un código de javascript? Pero, ¿cómo consigo el cargador en la aplicación C# o Vb.net?
Muchas gracias.
Toma un código de muestra. No tengo la vuelta en mi función: WebView1_WebMessageRecibido. ¿Por qué? Creo que olvidé algo...
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
Script Java:
document.addEventListener('mousedown', function (event)
{
let jsonObject =
{
Key: 'mousedown',
Value:
{
X: event.screenX,
Y: event.screenY
}
};
window.chrome.webview.postMessage(jsonObject);
});
Editar: Encontré mi error... ¡No era mucho!
Había olvidado la declaración del WebMessageRecibido en la propiedad de la webview.
Pregunta hecha hace 3 años, 4 meses, 28 días - Por codemaestro
4 Respuestas:
-
Vale, no conozco el VB. Net, pero pareces ser capaz de traducir el código C#, así que intentaré crear una solución de trabajo simple en C#:
Primero, descarga
Microsoft.Web.WebView2
yNewtonsoft.Json
desde Nuget e instalar en su proyecto (probablemente ya lo has hecho).Ahora suelta el
WebView2
on the form - then in Property Inspector:Establecer la fuente a: 'https://google.fr/'
doble clic
CoreWebView2InitializationCompleted
yWebMessageReceived
eventos para crear esqueletos en tu código.
Ahora agregue este código traducido al 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
(e.WebMessageAsJson); switch (jsonObject.Key) { case "click": MessageBox.Show(jsonObject.Value); break; } } } } Ahora cree un archivo javascript ('Mouse.js') en su directorio de proyecto, seleccione el archivo y en el inspector de propiedad seleccione Copiar al directorio de salida y elegir:
Copy if newer
. Eso significa que su archivo javascript puede ser encontrado por su programa VB utilizando el enlace relativo.Ahora pega el siguiente javascript en el archivo:
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); });
Ahora, cuando lo ejecute usted debe conseguir una caja de mensajes
Name
,ID
oTag Name
del elemento que haga clic (en ese orden).La razón por la que uso
Key: 'click'
acercamiento es que cuando más tarde desea detectar por ejemploMouseDown
Usted puede agregar fácilmente esa clave - entonces usted puede detectar ambos (Otros sólo puede detectar un tipo de evento).Actualización:
Cambios
CoreWebView2Ready
evento aCoreWebView2InitializationCompleted
. Ese es el nuevo nombre para el evento. UtilizaCoreWebView2InitializationCompletedEventArgs
como eventoArgs.Respondida el Dec 18, 2020 a las 09:22 - por debugdynamo
Votos positivos: 0 | Votos negativos: 0 -
Actualización para nuevos espacios de nombres de Microsoft:
using System.Text.Json; using System.Text.Json.Serialization; private void WebView_WebMessageReceived(object sender, CoreWebView2WebMessageReceivedEventArgs e) { JsonObject jsonObject = JsonSerializer.Deserialize
(e.WebMessageAsJson); switch (jsonObject.Key) { case "click": MessageBox.Show(jsonObject.Value); break; } } Respondida el Dec 18, 2020 a las 09:30 - por quantumcoder403a
Votos positivos: 0 | Votos negativos: 0 -
Para detectar un clic del ratón en un WebView2 en C
o VB.NET, puedes utilizar la comunicación entre JavaScript y la aplicación .NET a través de mensajes.
En tu código, estás inyectando un script JavaScript en tu WebView2 que captura el evento de clic del ratón y envía un mensaje al control WebView2. Luego, en el eventoWebView1_WebMessageReceived
, recibes el mensaje y ejecutas la lógica necesaria para manejar el clic del ratón.En tu ejemplo, parece que estás teniendo dificultades con la parte de la lógica en el evento
WebView1_WebMessageReceived
. La estructuraJsonObject
que estás utilizando en el ejemplo no parece coincidir con el JSON que estás enviando desde JavaScript. En el script JavaScript, estás enviando un objeto con una clave "mousedown" y un valor que contiene las coordenadas X e Y del clic del ratón. Por lo tanto, deberías ajustar la estructuraJsonObject
para que coincida con el formato del mensaje enviado desde JavaScript.Aquí te dejo un ejemplo de cómo podrías ajustar tu código para manejar el mensaje correctamente:
vb Structure JsonMessage Public Key As String Public Value As Point End Structure Private Sub WebView1_WebMessageReceived(ByVal sender As Object, ByVal e As CoreWebView2WebMessageReceivedEventArgs) Dim jsonMessage As JsonMessage = JsonConvert.DeserializeObject(Of JsonMessage)(e.WebMessageAsJson) If jsonMessage.Key = "mousedown" Then Dim mouseX As Integer = jsonMessage.Value.X Dim mouseY As Integer = jsonMessage.Value.Y ' Aquí puedes realizar la lógica para manejar el clic del ratón en las coordenadas mouseX y mouseY End If End Sub
Asegúrate de que la estructura
JsonMessage
coincida con el formato del mensaje enviado desde JavaScript y ajusta la lógica en elWebView1_WebMessageReceived
para manejar el clic del ratón adecuadamente. Con estos ajustes, deberías poder detectar el clic del ratón en tu WebView2 correctamente.Respondida el Dec 19, 2020 a las 09:24 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
Solución para detectar clics del ratón en WebView2
1. Manejar eventos WebMessageReceived:
Agrega el siguiente código para manejar eventos
WebMessageReceived
desde tu aplicación web JavaScript:csharp private void WebView1_WebMessageReceived(object sender, CoreWebView2WebMessageReceivedEventArgs e) { // Analiza el mensaje JSON var jsonObject = JsonConvert.DeserializeObject
(e.WebMessageAsJson); // Maneja el evento de clic según la clave del mensaje switch (jsonObject.Key) { case "mousedown": // Obtiene las coordenadas del clic var x = jsonObject.Value.X; var y = jsonObject.Value.Y; // Realiza la acción deseada (por ejemplo, mostrar un menú contextual en las coordenadas del clic) break; } } 2. Inyectar JavaScript para enviar eventos de clic:
Agrega el siguiente script JavaScript a tu página web para enviar eventos de clic como mensajes a la aplicación host:
javascript document.addEventListener('mousedown', function (event) { // Crea un objeto JSON con el evento de clic var jsonObject = { Key: 'mousedown', Value: { X: event.screenX, Y: event.screenY } }; // Envía el mensaje JSON a la aplicación host window.chrome.webview.postMessage(jsonObject); });
3. Habilitar los mensajes de WebView:
Para habilitar la recepción de mensajes de WebView, debes establecer la propiedad
WebMessageReceived
deWebView2
entrue
:csharp webview1.WebMessageReceived += WebView1_WebMessageReceived;
4. Agregar un script de inicialización a WebView:
Para inyectar el script JavaScript en la página web, debes agregar un script de inicialización a
WebView2
después de la navegación:csharp private void Webview1_NavigationCompleted(object sender, CoreWebView2NavigationCompletedEventArgs e) { webview1.CoreWebView2.Settings.AreDefaultContextMenusEnabled = false; var script = File.ReadAllText("d:\test_mouse.js"); webview1.CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync(script); }
Nota: Asegúrate de reemplazar la ruta del archivo
test_mouse.js
con la ubicación del script JavaScript real que contiene el código de inyección.Código de muestra completo:
csharp using Microsoft.Web.WebView2.Core; using Newtonsoft.Json; using System.IO; class MainWindow { // Estructura para el objeto JSON que contiene los datos del clic struct JsonObject { public string Key; public Point Value; } async void InitializeSyncroComponent() { await webview1.EnsureCoreWebView2Async(); webview1.CoreWebView2.Navigate("https://google.fr/"); webview1.WebMessageReceived += WebView1_WebMessageReceived; } void WebView1_WebMessageReceived(object sender, CoreWebView2WebMessageReceivedEventArgs e) { JsonObject jsonObject = JsonConvert.DeserializeObject
(e.WebMessageAsJson); switch (jsonObject.Key) { case "mousedown": // Obtiene las coordenadas del clic var x = jsonObject.Value.X; var y = jsonObject.Value.Y; // Realiza la acción deseada (por ejemplo, mostrar un menú contextual) break; } } void Webview1_NavigationCompleted(object sender, CoreWebView2NavigationCompletedEventArgs e) { webview1.CoreWebView2.Settings.AreDefaultContextMenusEnabled = false; var script = File.ReadAllText("d:\test_mouse.js"); webview1.CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync(script); } } Script JavaScript completo:
javascript document.addEventListener('mousedown', function (event) { var jsonObject = { Key: 'mousedown', Value: { X: event.screenX, Y: event.screenY } }; window.chrome.webview.postMessage(jsonObject); });
Con este código, ahora puedes detectar clics del ratón en tu página web insertada en
WebView2
y realizar las acciones deseadas en tu aplicación host.Respondida el Dec 19, 2020 a las 09:28 - por Gemini
Votos positivos: 0 | Votos negativos: 0