Erro: O evento BeforeNavigate2 do controle WebBrowser não disparado se hospedados em um aplicativo do .NET translation from VPE for Csharp Visual

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 325079
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Para uma versão deste artigo do Microsoft Visual Basic. NET, consulte 311298.
Sintomas
Se você coletar o evento BeforeNavigate2 do controle WebBrowser em um aplicativo .NET translation from VPE for Csharp, o evento não será acionado.
Resolução
Para contornar esse problema, ligar manipuladores de eventos para a interface de origem não-padrão, nesse caso, a interface DWebBrowserEvents. Isso significa que você precisa implementar o DWebBrowserEvents e seus métodos (dos quais existem 17).
public void BeforeNavigate(string URL, int Flags, string TargetFrameName, ref object PostData, string Headers, ref bool Cancel){MessageBox.Show("C# DWebBrowser::BeforeNavigate event fired!", "DWebBrowser Event");}public void PropertyChange(string Property){}public void NavigateComplete(string URL){}public void WindowActivate(){}public void FrameBeforeNavigate(string URL, int Flags, string TargetFrameName, ref object PostData, string Headers, ref bool Cancel){}public void NewWindow(string URL, int Flags, string TargetFrameName, ref object PostData, string Headers, ref bool Processed){}public void FrameNewWindow(string URL, int Flags, string TargetFrameName, ref object PostData, string Headers, ref bool Processed){}public void TitleChange(string Text){}public void DownloadBegin(){}public void DownloadComplete(){}public void WindowMove(){}public void WindowResize(){}public void Quit(ref bool Cancel){}public void ProgressChange(int Progress, int ProgressMax){}public void StatusTextChange(string Text){}public void CommandStateChange(int Command, bool Enable){}public void FrameNavigateComplete(string URL){}				
anunciam classes COM que eles oferecem suporte eventos Implementando uma interface denominada IConnectionPointContainer e retornando objetos de ponto de conexão por meio de nesta interface. Objetos de ponto de conexão, que implementam IConnectionPoint, são fornecidos pelos objetos conectável, que representa uma coleção de eventos.

O namespace System.Runtime.InteropServices define interfaces COM comuns, como IConnectionPointContainer e IConnectionPoint. Essas definições podem ser confusas porque cada interface foi renomeada com o prefixo "UCOM" adicionado. Indica não gerenciado "U"; "COM" indica que a interface é definida originalmente no COM.

Em InteropServices, as interfaces IConnectionPointContainer e IConnectionPoint estão definidas como segue:
  • UCOMIConnectPointContainer
  • UCOMIConnectionPoint
Embora os nomes das interfaces sejam diferentes, COM não reconhece nenhuma diferença entre uma interface "UCOM" e sua definição de não gerenciada correspondente.

Ao desenvolver código, você deve fazer o seguinte:
  • Obter a interface IConnectionPointContainer.
    private UCOMIConnectionPoint icp;UCOMIConnectionPointContainer icpc = (UCOMIConnectionPointContainer)axWebBrowser1.GetOcx(); 					
  • Obter a interface IConnectionPoint para um IID especificado (interface de evento que desejam se inscrever) usando o método IConnectionPointContainer::FindConnectinPoint .
    Guid g = typeof(DWebBrowserEvents).GUID;icpc.FindConnectionPoint(ref g, out icp);						
    usando os métodos Unadvise e IConnectionPoint interface Aviso , clientes podem conectar e desprender ponteiros de interface de retorno de chamada. Um cliente chama IConnectionPoint::Advise com o ponteiro IUnknown a mesmo e, em seguida, Aviso volta passa um cookie integral que identifica exclusivamente a conexão. Em um retorno bem-sucedido, o Aviso contém o cookie de conexão. O valor pdwCookie deve ser exclusivo para cada conexão com qualquer instância específica de um ponto de conexão.
  • Use o método IConnectionPoint::Advise para estabelecer uma conexão entre o objeto de ponto de conexão e coletor do cliente.
    icp.Advise(this, out cookie);					
  • Use o método IConnectionPoint::Unadvise para desconectar uma conexão entre o objeto de ponto de conexão e coletor do cliente.
    icp.Unadvise(cookie);					

Código de exemplo do Visual translation from VPE for Csharp .NET:

Cole o seguinte código em um módulo de formulário Visual translation from VPE for Csharp .NET Windows:
using System;using System.Drawing;using System.Windows.Forms;using System.Data;using SHDocVw;using System.Runtime.InteropServices;namespace wbcs{	/// <summary>	/// Summary description for Form1.	/// </summary>	public class Form1 : System.Windows.Forms.Form, DWebBrowserEvents	{		private UCOMIConnectionPoint icp; 		private int cookie = -1; 				private AxSHDocVw.AxWebBrowser axWebBrowser1;		/// <summary>		/// Required designer variable.		/// </summary>		private System.ComponentModel.Container components = null;		public Form1()		{			// 			// Required for Windows Form Designer support			// 			InitializeComponent();			UCOMIConnectionPointContainer icpc = (UCOMIConnectionPointContainer)axWebBrowser1.GetOcx(); // ADDed 			Guid g = typeof(DWebBrowserEvents).GUID;			icpc.FindConnectionPoint(ref g, out icp);			icp.Advise(this, out cookie);		}		/// <summary>		/// Clean up any resources being used.		/// </summary>		protected override void Dispose( bool disposing )		{			if( disposing )			{				// Release event sink				if (-1 != cookie) icp.Unadvise(cookie);				        cookie = -1;                                if (components != null) 				{					components.Dispose();				}			}			base.Dispose( disposing );		}		#region Windows Form Designer generated code		/// <summary>		/// Required method for Designer support; do not modify		/// the contents of this method with the code editor.		/// </summary>		private void InitializeComponent()		{			System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(Form1));			this.axWebBrowser1 = new AxSHDocVw.AxWebBrowser();			((System.ComponentModel.ISupportInitialize)(this.axWebBrowser1)).BeginInit();			this.SuspendLayout();			// 			// axWebBrowser1			// 			this.axWebBrowser1.Enabled = true;			this.axWebBrowser1.Location = new System.Drawing.Point(8, 16);			this.axWebBrowser1.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("axWebBrowser1.OcxState")));			this.axWebBrowser1.Size = new System.Drawing.Size(448, 240);			this.axWebBrowser1.TabIndex = 0;			// 			// Form1			// 			this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);			this.ClientSize = new System.Drawing.Size(472, 273);			this.Controls.AddRange(new System.Windows.Forms.Control[] {																		  this.axWebBrowser1});			this.Name = "Form1";			this.Text = "Form1";			this.Load += new System.EventHandler(this.Form1_Load); 			((System.ComponentModel.ISupportInitialize)(this.axWebBrowser1)).EndInit();			this.ResumeLayout(false);		}		#endregion		/// <summary>		/// The main entry point for the application.		/// </summary>		[STAThread]		static void Main() 		{			Application.Run(new Form1());		}		private void Form1_Load(object sender, System.EventArgs e)		{			object obj = null;			axWebBrowser1.Navigate ("http://www.microsoft.com", ref obj, ref obj, ref obj, ref obj);		}		public void BeforeNavigate(string URL, int Flags, string TargetFrameName, 			ref object PostData, string Headers, ref bool Cancel)		{			MessageBox.Show("C# DWebBrowser::BeforeNavigate event fired!", "DWebBrowser Event");		}		public void PropertyChange(string Property){}		public void NavigateComplete(string URL){}		public void WindowActivate(){}		public void FrameBeforeNavigate(string URL, int Flags, string TargetFrameName, ref object PostData, string Headers, ref bool Cancel){}		public void NewWindow(string URL, int Flags, string TargetFrameName, ref object PostData, string Headers, ref bool Processed){}		public void FrameNewWindow(string URL, int Flags, string TargetFrameName, ref object PostData, string Headers, ref bool Processed){}		public void TitleChange(string Text){}		public void DownloadBegin(){}		public void DownloadComplete(){}		public void WindowMove(){}		public void WindowResize(){}		public void Quit(ref bool Cancel){}		public void ProgressChange(int Progress, int ProgressMax){}		public void StatusTextChange(string Text){}		public void CommandStateChange(int Command, bool Enable){}		public void FrameNavigateComplete(string URL){}	}}				
Situação
A Microsoft confirmou que este é um bug no Microsoft produtos que estão listados no início deste artigo.
Mais Informações
Uma correção com suporte foi disponibilizada pela Microsoft. Para obter informações adicionais sobre essa correção, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
327135BeforeNavigate2 evento de controle WebBrowser não disparado

Passos para reproduzir o problema

  1. Inicie o Visual Studio NET..
  2. Crie um novo Visual translation from VPE for Csharp .NET Windows Application projeto.
  3. Clique com o botão direito na janela Toolbox e clique em Customize Toolbox .
  4. Na guia Componentes COM , selecione a caixa de seleção Microsoft Web Browser .

    Observe que o controle WebBrowser é adicionado à guia na caixa de ferramentas que você escolheu personalizar de controles .
  5. Arraste o controle WebBrowser da caixa de ferramentas para o formulário .NET translation from VPE for Csharp Visual. AxWebBrowser1 é o nome padrão.
  6. Clique duas vezes o formulário para abrir a janela de código para o método Form1_Load . Adicione o seguinte código para o método Form1_Load :
    private void Form1_Load(object sender, System.EventArgs e)		{			object oURL = "http://www.microsoft.com";			object oEmpty = "";			axWebBrowser1.Navigate2(ref oURL, ref oEmpty, ref oEmpty, ref oEmpty, ref oEmpty);		}					
  7. Para exibir os eventos para o objeto, na janela Properties AxWebBrowser1 , clique em eventos e, em seguida, execute as seguintes etapas:
    1. Na lista de eventos disponíveis, clique no evento BeforeNavigate2 para criar um manipulador de eventos.
    2. Na caixa à direita do nome do evento, digite o nome do manipulador TestBeforeNavigate2 e, em seguida, pressione ENTER. O Editor de código aparece; o código para o formulário é exibido e um método manipulador de eventos é gerado no código.

      Observação : a barra de ferramentas janela de propriedades de eventos está disponível somente quando um formulário ou designer de controle está ativo no contexto de um Visual .NET translation from VPE for Csharp projeto.
  8. Adicione o seguinte código para o AxWebBrowser1 método do manipulador de eventos de BeforeNavigate2 evento:
    private void TestBeforeNavigate2(object sender, AxSHDocVw.DWebBrowserEvents2_BeforeNavigate2Event e)		{		 MessageBox.Show ("BeforeNavigate event fired!");		}					
  9. No menu Debug , clique em Iniciar para executar o código. Como alternativa, você pode pressionar F5 para executar o código.

    Observe que o controle WebBrowser abre o site da Microsoft. No entanto, observe que o evento BeforeNavigate2 não é disparado antes de ele navega para o site da Microsoft.
Referências
311298Erro: O evento BeforeNavigate2 do controle WebBrowser não disparado se hospedados no aplicativo do Visual Basic .NET

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 325079 - Última Revisão: 12/07/2015 11:37:26 - Revisão: 2.1

Microsoft Visual C# .NET 2002 Standard Edition

  • kbnosurvey kbarchive kbmt kbcominterop kbwebbrowser kbctrlcreate kbctrl kbevent kbbug kbnofix KB325079 KbMtpt
Comentários