Obter o URL de um hiperlink em um documento TWebBrowser

Na maioria das situações, você usa o TWebBrowser para exibir documentos HTML para o usuário - criando assim sua própria versão do navegador da Web (Internet Explorer). Observe que o TWebBrowser também pode exibir documentos do Word, por exemplo.

Um recurso muito bom de um navegador é exibir informações do link, por exemplo, na barra de status, quando o mouse passa o mouse sobre um link em um documento.

O TWebBrowser não expõe um evento como "OnMouseMove". Mesmo que esse evento exista, ele será acionado para o componente TWebBrowser - NÃO para o documento que está sendo exibido dentro do TWebBrowser.

Para fornecer essas informações (e muito mais, como você verá em breve) em seu aplicativo Delphi usando o componente TWebBrowser, uma técnica chamada "eventos afundando"deve ser implementado.

Para navegar para uma página da Web usando o componente TWebBrowser, chame o Navegar método. o Documento A propriedade do TWebBrowser retorna um IHTMLDocument2 valor (para documentos da web). Essa interface é usada para recuperar informações sobre um documento, examinar e modificar os elementos e o texto HTML dentro do documento e processar eventos relacionados.

instagram viewer

Para obter o atributo "href" (link) de uma marca "a" dentro de um documento, enquanto o mouse passa o mouse sobre um documento, é necessário reagir ao evento "onmousemove" do IHTMLDocument2.

Como estamos interessados ​​no atributo HREF de um elemento A - para mostrar a URL de um link que o mouse acabou, afundaremos o evento "onmousemove".

Como explicado acima, anexamos ao evento onmousemove de um documento no evento OnDocumentComplete de um TWebBrowser:

unidade Unidade 1;
interface
usa
Windows, Mensagens, SysUtils, Variantes, Classes, Gráficos, Controles, Formulários,
Diálogos, OleCtrls, SHDocVw, MSHTML, ActiveX, StdCtrls;
tipo
TObjectProcedure = procedimentodoobjeto;
TEventObject = classe(TInterfacedObject, IDispatch)
privado
FOnEvent: TObjectProcedure;
protegido
função GetTypeInfoCount (sem Contagem: Inteiro): HResult; stdcall;
função GetTypeInfo (Index, LocaleID: Integer; out TypeInfo): HResult; stdcall;
função GetIDsOfNames (const IID: TGUID; Nomes: Ponteiro; NameCount, LocaleID: Inteiro; DispIDs: Ponteiro): HResult; stdcall;
função Invocar (DispID: Inteiro; const IID: TGUID; LocaleID: Inteiro; Sinalizadores: Word; var Params; VarResult, ExcepInfo, ArgErr: Ponteiro): HResult; stdcall;
público
construtor Crio(const OnEvent: TObjectProcedure);
propriedade OnEvent: TObjectProcedure lê FOnEvent escreve FOnEvent;
fim;
TForm1 = classe(TForm)
WebBrowser1: TWebBrowser;
elementInfo: TMemo;
procedimento WebBrowser1BeforeNavigate2 (ASender: TObject; const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData, Headers: OleVariant; var Cancelar: WordBool);
procedimento WebBrowser1DocumentComplete (ASender: TObject; const pDisp: IDispatch; var URL: OleVariant);
procedimento FormCreate (Remetente: TObject);
privado
procedimento Document_OnMouseOver;
público
{ Público declarações}
fim;
var
Formulário1: TForm1;
htmlDoc: IHTMLDocument2;
implementação
{$ R * .dfm}
procedimento TForm1.Document_OnMouseOver;
var
elemento: IHTMLElement;
início
E se htmlDoc = nadaentão Saída;
elemento: = htmlDoc.parentWindow.event.srcElement;
elementInfo. Claro;
E se LowerCase (element.tagName) = 'a' então
início
elementInfo. Linhas. Add ('LINK info ...');
elementInfo. Linhas. Add (Format ('HREF:% s', [elemento.getAttribute ('href', 0)]));
fim
outroE se LowerCase (element.tagName) = 'img' então
início
elementInfo. Linhas. Add ('IMAGE info ...');
elementInfo. Linhas. Add (Format ('SRC:% s', [element.getAttribute ('src', 0)]));
fim
outro
início
elementInfo. Linhas. Add (Format ('TAG:% s', [element.tagName]));
fim;
fim; (* Document_OnMouseOver *)
procedimento TForm1.FormCreate (Remetente: TObject);
início
WebBrowser1.Navigate (' http://delphi.about.com') ;
elementInfo. Claro;
elementInfo. Linhas. Add ('Mova o mouse sobre o documento ...');
fim; (* FormCreate *)
procedimento TForm1.WebBrowser1BeforeNavigate2 (ASender: TObject; const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData, Headers: OleVariant; var Cancelar: WordBool);
início
htmlDoc: = nada;
fim; (* WebBrowser1BeforeNavigate2 *)
procedimento TForm1.WebBrowser1DocumentComplete (ASender: TObject; const pDisp: IDispatch; var URL: OleVariant);
início
E se Atribuído (WebBrowser1.Document) então
início
htmlDoc: = WebBrowser1.Document Como IHTMLDocument2;
htmlDoc.onmouseover: = (TEventObject. Criar (Document_OnMouseOver) Como IDispatch);
fim;
fim; (* WebBrowser1DocumentComplete *)
{TEventObject}
construtor TEventObject. Crio(const OnEvent: TObjectProcedure);
início
herdado Crio;
FOnEvent: = OnEvent;
fim;
função TEventObject. GetIDsOfNames (const IID: TGUID; Nomes: Ponteiro; NameCount, LocaleID: Inteiro; DispIDs: Ponteiro): HResult;
início
Resultado: = E_NOTIMPL;
fim;
função TEventObject. GetTypeInfo (Index, LocaleID: Integer; out TypeInfo): HResult;
início
Resultado: = E_NOTIMPL;
fim;
função TEventObject. GetTypeInfoCount (sem Contagem: Inteiro): HResult;
início
Resultado: = E_NOTIMPL;
fim;
função TEventObject. Invocar (DispID: Inteiro; const IID: TGUID; LocaleID: Inteiro; Sinalizadores: Word; var Params; VarResult, ExcepInfo, ArgErr: Ponteiro): HResult;
início
E se (DISPID = DISPID_VALUE) então
início
E se Atribuído (FOnEvent) então Evento;
Resultado: = S_OK;
fim
outro Resultado: = E_NOTIMPL;
fim;
fim.

instagram story viewer