WinForms - Como faço para executar C# o código do aplicativo de dentro do controle WebBrowser?

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

  •  08-07-2019
  •  | 
  •  

Pergunta

Eu tenho um formulário que contém um controle de navegador da web.Este controle de navegador irá carregar o HTML a partir do disco e exibi-lo.Eu quero ser capaz de ter um botão em HTML acesso de código C# no meu formulário.

Por exemplo, um botão em HTML pode chamar o método Close() no formulário.

Plataforma de destino:C# e Formulários do Windows (qualquer versão)

Foi útil?

Solução

Olhe para o WebBrowser.ObjectForScripting propriedade. Conseguimos obter o Google Maps falar com um aplicativo Windows Forms usando isso.

Outras dicas

Eu implemeted isso em algumas aplicações no passado, aqui está como: (NB: o exemplo a seguir não é produção pronto e deve ser usado apenas como um guia)

.

Primeiro, crie uma classe .NET normal (público) que contém métodos públicos que você deseja chamar da Javasvcipt correndo em seu controle navegador web.

O mais importante deve ser decorado com o (verdadeiro)] atributo ComVisible do namespace System.Runtime.InteropServices (JavaScript no IE é COM base). Ele pode ser chamado de qualquer coisa, eu já o chamou de "externo" para tornar as coisas mais claras.

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 seguir, na forma .NET que contém o controle de navegador web criar uma instância da classe ComVisible, em seguida, definir os controles do navegador web ObjectForScripting a essa instância:

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

         browserControl.ObjectForScripting = m_external; 
    }

Finalmente, em seu Javascript em execução no controle de navegador web, você acessar os métodos .NET através do objeto window.external. Neste caso window.external realmente referências (indiretamente através de uma interoperabilidade invólucro) do objeto "externo" criado acima:

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

Esteja ciente de que as chamadas de Javascript para .NET passar através da camada de interoperabilidade e assim consultando da interface padrão, triagem de parâmetros etc devem ocorrer. Em outras palavras, pode ser relativamente lento, então, fazer alguns testes de desempenho, se você pretende fazer várias chamadas, por exemplo, de dentro de um loop.

Além disso, apenas para referência futura, chamando código Javascript do .NET é mais simples, basta usar o método Document.InvokeScript:

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

O que eu fiz em VB6:

  • Adicionar um grupo personalizado < A > tags no documento HTML, defina os seus href para algo significativo para você, como o#closeform'
  • No BeforeNavigate método, verifique o endereço que o navegador está tentando ir para e agir de acordo.Em seguida, cancelar o browser de navegação.

Tudo que você tem a fazer é adicionar um manipulador de eventos para o evento Navigating do WebBrowser.

Este evento é disparado antes dos navega navegador para a página seguinte. Ele permite que você interromper o processo e fazer o que quiser, inclusive cancelando a navegação e pôr em seu código.

Muito fácil de usar. A única ressalva que eu me deparei é que você não pode ver o PostData - ver a minha pergunta aqui: PostData Pergunta

Aqui está um código de exemplo:

    private void MyMethod()
    {
        // do something
    }

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

Isso é possível, mas eu não tê-lo feito em .NET. Alguns anos atrás eu tinha um aplicativo C ++ que sediou um controle de navegador web (ActiveX). A partir do HTML no controle, foi possível chamar 'out' para o controle ActiveX e obtê-lo de fazer as coisas.

O mesmo deve ser possível em .NET, embora HTML DOM / JavaScript não vai saber sobre C #. Mas se você quebrar sua funcionalidade .NET em um objeto COM, você deve ser capaz de chamar métodos no COM objetos / ActiveX que no turno chamar seu código C #.

Espero que isso ajude.

Eu fiz isso há vários anos, e blog sobre isso aqui:

http://matthewskelton.wordpress.com/2007 / 04/21 / chamando-javascript-de-c /

Especificamente, você pode usar Type.InvokeMember() chamar JavaScript do C #.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top