WinForms: ¿cómo ejecuto el código de la aplicación C # desde el control de WebBrowser?

StackOverflow https://stackoverflow.com/questions/305915

  •  08-07-2019
  •  | 
  •  

Pregunta

Tengo un formulario que contiene un control de navegador web. Este control del navegador cargará algo de HTML del disco y lo mostrará. Quiero poder tener un botón en el código C # de acceso HTML en mi formulario.

Por ejemplo, un botón en el HTML podría llamar al método Close () en el formulario.

Plataforma de destino: C # y Windows Forms (cualquier versión)

¿Fue útil?

Solución

Mire el WebBrowser.ObjectForScripting propiedad. Logré que Google Maps hablara con una aplicación de formularios de Windows usando esto.

Otros consejos

He implementado esto en algunas aplicaciones en el pasado, así es como: (Nota: el ejemplo a continuación no está listo para la producción y debe usarse solo como una guía).

Primero cree una clase .NET normal (pública) que contenga métodos públicos a los que desee llamar desde Javasvcipt ejecutándose en el control de su navegador web.

Lo más importante es que debe decorarse con el atributo ComVisible (verdadero)] del espacio de nombres System.Runtime.InteropServices (Javascript en IE está basado en COM). Puede llamarse cualquier cosa, lo he llamado & Quot; Externo & Quot; para aclarar las cosas

using System.Runtime.InteropServices;

[ComVisible(true)]
public class External
{
    private static MainWindow m_mainWindow = null;

    public External(MainWindow mainWindow)
    {
        m_mainWindow = mainWindow; 
    }

    public void CloseApplication()
    {
        m_mainWindow.Close();
    }


    public string CurrentDate(string format)
    {
        return DateTime.Now.ToString(format);  
    }
}

A continuación, en el formulario .NET que contiene el control de su navegador web, cree una instancia de la clase COMVisible, luego configure los controles ObjectForScripting del navegador web para esa instancia:

    private void MainWindow_Load(object sender, EventArgs e)
    {
         m_external = new External(this);

         browserControl.ObjectForScripting = m_external; 
    }

Finalmente, en su Javascript que se ejecuta en el control del navegador web, accede a los métodos .NET a través del objeto window.external. En este caso, window.external en realidad hace referencia (indirectamente a través de un contenedor de interoperabilidad COM) el & Quot; Externo & Quot; objeto creado arriba:

// Javascript code
function CloseButton_Click()
{
    if (window.external)
    {
        window.external.CloseApplication();
    }
}

Tenga en cuenta que las llamadas de Javascript a .NET pasan a través de la capa de interoperabilidad COM y, por lo tanto, debe realizarse una consulta de la interfaz predeterminada, la clasificación de parámetros, etc. En otras palabras, puede ser relativamente LENTO, así que realice algunas pruebas de rendimiento si planea hacer varias llamadas, por ejemplo, desde un bucle.

Además, solo para referencia futura, llamar al código Javascript desde .NET es más simple, solo use el método Document.InvokeScript:

    browserControl.Document.InvokeScript("jScriptFunction", new object[] { "param1", 2, "param2" });

Lo que hice en VB6:

  • Agregue un montón de < personalizado; A & Gt; etiquetas en el documento HTML, configure su href en algo significativo para usted, como '#closeform'
  • En el método BeforeNavigate, verifique la dirección a la que intenta acceder el navegador y actúe en consecuencia. Luego cancele la navegación del navegador.

Todo lo que tiene que hacer es agregar un controlador de eventos para el evento de navegación del navegador web.

Este evento se activa antes de que el navegador navegue a la página siguiente. Le permite interrumpir el proceso y hacer lo que quiera, incluyendo cancelar la navegación y llamar a su código.

Bastante fácil de usar. La única advertencia que he encontrado es que no puede ver los Datos de Post. Vea mi pregunta aquí: Pregunta de PostData

Aquí hay un código de muestra:

    private void MyMethod()
    {
        // do something
    }

    private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
    {
        MyMethod();
        e.Cancel = true;
    }

Esto es posible, pero no lo he hecho en .NET. Hace unos años tenía una aplicación C ++ que alojaba un control de navegador web (ActiveX). Desde el HTML en el control, fue posible llamar 'fuera' al control ActiveX y hacer que haga cosas.

Lo mismo debería ser posible en .NET, aunque HTML DOM / JavaScript no conocerá C #. Pero si ajusta su funcionalidad .NET en un objeto COM, debería poder llamar a métodos en los objetos COM / ActiveX que a su vez llamarán a su código C #.

Espero que esto ayude.

Hice esto hace varios años, y escribí en un blog aquí:

http://matthewskelton.wordpress.com/2007 / 04/21 / calling-javascript-from-c /

Específicamente, puede usar Type.InvokeMember() para llamar a JavaScript desde C #.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top