Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

709
Vistas
comunicación bidireccional entre c # y JS usando webview2

Estoy usando un control webview2 en una aplicación winforms. Uso mensajes para comunicarme entre C# y Javascript.

  • window.chrome.webview.addEventListener / window.chrome.webview.postMessage en Javascript
  • evento .CoreWebView2.WebMessageReceived y método CoreWebView2.PostWebMessageAsString en C#

La comunicación funciona PERO solo después de que la página en webview2 se haya actualizado de alguna manera. JS siempre ignora/no recibe el primer mensaje enviado por C#. Los mensajes posteriores se reciben y procesan correctamente.

Mi código de interfaz de usuario:

 public GUI() { InitializeComponent(); browser.Source = new Uri(System.IO.Path.GetFullPath("HTML/ui.html")); InitializeAsync(); } async void InitializeAsync() { await browser.EnsureCoreWebView2Async(null); browser.CoreWebView2.WebMessageReceived += MessageReceived; } void MessageReceived(object sender, CoreWebView2WebMessageReceivedEventArgs args) { String content = args.TryGetWebMessageAsString(); if (content.StartsWith("getData")) { ReadDataFromCATIA(); var serializerSettings = new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.Objects }; string jsonRootNode = JsonConvert.SerializeObject(this.RootNode, Formatting.Indented, serializerSettings); //here I've got the message I want to post //String input = args.TryGetWebMessageAsString(); //MessageBox.Show("string from JS: " + input); browser.CoreWebView2.PostWebMessageAsString(jsonRootNode); } else //object received { ProductNode received = JsonConvert.DeserializeObject<ProductNode>(content); MessageBox.Show(received.PartNumber + " received"); } }

y mi JS en ui.html

 window.chrome.webview.addEventListener('message', event => { alert(event.data); WriteDataFromCsharp(event.data); }); function WriteDataFromCsharp(data) { var target = document.getElementById('target'); if (target === null) { alert('target not found') }; //alert(target.id); //target.textContent = event.data; rootNode = JSON.parse(data); target.innerHTML = addTable(rootNode); //addTable create an HTML table from the deserialized object rootNode } function RequestData() { //function triggered by a button on the html page //alert('post to c#'); window.chrome.webview.postMessage('getData'); }

Hasta ahora, he intentado:

  • asegúrese de que el javascript esté lo más tarde posible en la página (diferir, al final del cuerpo). Sin cambios.
  • inyecta el javascript en la página después de que se haya cargado usando .CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync(jsCode). Mismo comportamiento.
  • inyecte el javascript después de que se haya activado el evento NavigationCompleted. mismo comportamiento.

¿Qué echo de menos?

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Finalmente encontré al culpable: en mi página HTML, he usado un "enviar" en lugar de un "botón". Con

 <input type="button" value="Load data from V5" onclick="RequestData()" />

El comportamiento de la página es el esperado.

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda