Get the Url of a Hyperlink when the Mouse moves Over a TWebBrowser Document

简介:

The TWebBrowser Delphi component provides access to the Web browser functionality from your Delphi applications.

In most situations you use the TWebBrowser to display HTML documents to the user - thus creating your own version of the (Internet Explorer) Web browser. Note that the TWebBrowser can also display Word documents, for example.

A very nice feature of a Browser is to display link information, for example, in the status bar, when the mouse hovers over a link in a document.

The TWebBrowser does not expose an event like "OnMouseMove". Even if such an event would exist it would be fired for the TWebBrowser component - NOT for the document being displayed inside the TWebBrowser.

In order to provide such information (and much more, as you will see in a moment) in your Delphi application using the TWebBrowser component, a technique called "events sinking" must be implemeted.

WebBrowser Event Sink

To navigate to a web page using the TWebBrowser component you call the  Navigate  method. The  Document  property of the TWebBrowser returns an  IHTMLDocument2  value (for web documents). This interface is used to retrieve information about a document, to examine and modify the HTML elements and text within the document, and to process related events.

To get the "href" attribute (link) of an "a" tag inside a document, while the mouse hovers over a document, you need to react on the "onmousemove" event of the IHTMLDocument2.

Here are the steps to sink events for the currently loaded document:

  1. Sink the WebBrowser control's events in the DocumentComplete event raised by the TWebBrowser. This event is fired when the document is fully loaded into the Web Browser.
  2. Inside DocumentComplete, retrieve the WebBrowser's document object and sink the HtmlDocumentEvents interface.
  3. Handle the event you are interested in.
  4. Clear the sink in the in BeforeNavigate2 - that is when the new document is loaded in the Web Browser.

 

unit Unit1;

interface

uses
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Dialogs, OleCtrls, SHDocVw, MSHTML, ActiveX, StdCtrls;

type
   TObjectProcedure 
=  procedure of  object ;

   TEventObject 
=   class (TInterfacedObject, IDispatch)
   
private
     FOnEvent: TObjectProcedure;
   
protected
     function GetTypeInfoCount(
out  Count: Integer): HResult; stdcall;
     function GetTypeInfo(Index, LocaleID: Integer; 
out  TypeInfo): HResult; stdcall;
     function GetIDsOfNames(
const  IID: TGUID; Names: Pointer; NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall;
     function Invoke(DispID: Integer; 
const  IID: TGUID; LocaleID: Integer; Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall;
   
public
     constructor Create(
const  OnEvent: TObjectProcedure) ;
     property OnEvent: TObjectProcedure read FOnEvent write FOnEvent;
   end;

   TForm1 
=   class (TForm)
     WebBrowser1: TWebBrowser;
     elementInfo: TMemo;
     procedure WebBrowser1BeforeNavigate2(ASender: TObject; 
const  pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData, Headers: OleVariant; var Cancel: WordBool) ;
     procedure WebBrowser1DocumentComplete(ASender: TObject; 
const  pDisp: IDispatch; var URL: OleVariant) ;
     procedure FormCreate(Sender: TObject) ;
   
private
     procedure Document_OnMouseOver;
   
public
     { Public declarations }
   end;

var
   Form1: TForm1;

   htmlDoc : IHTMLDocument2;

implementation

{$R 
* .dfm}

procedure TForm1.Document_OnMouseOver;
var
   element : IHTMLElement;
begin
   
if  htmlDoc  =  nil then Exit;

   element :
=  htmlDoc.parentWindow. event .srcElement;

   elementInfo.Clear;

   
if  LowerCase(element.tagName)  =   ' a '  then
   begin
     elementInfo.Lines.Add(
' LINK info ' ) ;
     elementInfo.Lines.Add(Format(
' HREF : %s ' ,[element.getAttribute( ' href ' , 0 )])) ;
   end
   
else   if  LowerCase(element.tagName)  =   ' img '  then
   begin
     elementInfo.Lines.Add(
' IMAGE info ' ) ;
     elementInfo.Lines.Add(Format(
' SRC : %s ' ,[element.getAttribute( ' src ' , 0 )])) ;
   end
   
else
   begin
     elementInfo.Lines.Add(Format(
' TAG : %s ' ,[element.tagName])) ;
   end;
end; (
* Document_OnMouseOver * )


procedure TForm1.FormCreate(Sender: TObject) ;
begin
   WebBrowser1.Navigate(
' http://delphi.about.com ' ) ;

   elementInfo.Clear;
   elementInfo.Lines.Add(
' Move your mouse over the document ' ) ;
end; (
* FormCreate * )

procedure TForm1.WebBrowser1BeforeNavigate2(ASender: TObject; 
const  pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData, Headers: OleVariant; var Cancel: WordBool) ;
begin
   htmlDoc :
=  nil;
end; (
* WebBrowser1BeforeNavigate2 * )

procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject; 
const  pDisp: IDispatch; var URL: OleVariant) ;
begin
   
if  Assigned(WebBrowser1.Document) then
   begin
     htmlDoc :
=  WebBrowser1.Document  as  IHTMLDocument2;

     htmlDoc.onmouseover :
=  (TEventObject.Create(Document_OnMouseOver)  as  IDispatch) ;
   end;
end; (
* WebBrowser1DocumentComplete * )


{ TEventObject }

constructor TEventObject.Create(
const  OnEvent: TObjectProcedure) ;
begin
   inherited Create;
   FOnEvent :
=  OnEvent;
end;

function TEventObject.GetIDsOfNames(
const  IID: TGUID; Names: Pointer; NameCount, LocaleID: Integer; DispIDs: Pointer): HResult;
begin
   Result :
=  E_NOTIMPL;
end;

function TEventObject.GetTypeInfo(Index, LocaleID: Integer; 
out  TypeInfo): HResult;
begin
   Result :
=  E_NOTIMPL;
end;

function TEventObject.GetTypeInfoCount(
out  Count: Integer): HResult;
begin
   Result :
=  E_NOTIMPL;
end;

function TEventObject.Invoke(DispID: Integer; 
const  IID: TGUID; LocaleID: Integer; Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult;
begin
   
if  (DispID  =  DISPID_VALUE) then
   begin
     
if  Assigned(FOnEvent) then FOnEvent;
     Result :
=  S_OK;
   end
   
else  Result : =  E_NOTIMPL;
end;

end.


    本文转自 OldHawk  博客园博客,原文链接:http://www.cnblogs.com/taobataoma/archive/2007/04/29/732449.html ,如需转载请自行联系原作者


相关文章
|
23天前
|
存储 缓存 网络协议
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点,GET、POST的区别,Cookie与Session
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点、状态码、报文格式,GET、POST的区别,DNS的解析过程、数字证书、Cookie与Session,对称加密和非对称加密
|
前端开发 Java
Java 技术篇 - 前端浏览器发送一次url请求后端ServerSocket接收到两次请求原因及解决方法,GET /favicon.ico HTTP/1.1问题处理
Java 技术篇 - 前端浏览器发送一次url请求后端ServerSocket接收到两次请求原因及解决方法,GET /favicon.ico HTTP/1.1问题处理
773 0
Java 技术篇 - 前端浏览器发送一次url请求后端ServerSocket接收到两次请求原因及解决方法,GET /favicon.ico HTTP/1.1问题处理
|
6月前
|
应用服务中间件 nginx Windows
nginx实现网站url带参跳转 POST请求GET请求跳转
nginx实现网站url带参跳转 POST请求GET请求跳转
317 1
|
5月前
|
JavaScript 前端开发 数据格式
URL编码【详解】——Javascript对URL进行编码解码的三种方式的区别和使用场景,axios请求拦截器中对get请求的参数全部进行URL编码
URL编码【详解】——Javascript对URL进行编码解码的三种方式的区别和使用场景,axios请求拦截器中对get请求的参数全部进行URL编码
261 0
|
6月前
|
Windows
iis配置http重定向302转发get请求并去掉最后的斜杠/ iis重定向 iis去除url最后的斜杠 iis重定向链接斜杠(已解决)
iis配置http重定向302转发get请求并去掉最后的斜杠/ iis重定向 iis去除url最后的斜杠 iis重定向链接斜杠(已解决)
176 0
|
JSON JavaScript 数据格式
HackerNews05-通过使用url模块的parse方法获取用户get提交的数据|学习笔记
快速学习 HackerNews05-通过使用url模块的parse方法获取用户get提交的数据
HackerNews05-通过使用url模块的parse方法获取用户get提交的数据|学习笔记
|
Java
springboot 接收post、get、重定向,并从url中获取参数
springboot 接收post、get、重定向,并从url中获取参数
941 0
|
JSON 移动开发 JavaScript
AngularJS中get请求URL出现跨域问题
AngularJS中get请求URL出现跨域问题
232 0
AngularJS中get请求URL出现跨域问题
|
JavaScript PHP
php中$_GET如何读取带+号的字符串: 比如URL中&c=a+b,用$_GET[c]读取到的值是等于'a b',而不是'a+b',为什么?...
php中$_GET如何读取带+号的字符串: 比如URL中&c=a+b,用$_GET[c]读取到的值是等于'a b',而不是'a+b',为什么?...
286 0
php中$_GET如何读取带+号的字符串: 比如URL中&c=a+b,用$_GET[c]读取到的值是等于'a b',而不是'a+b',为什么?...
|
Web App开发 存储 缓存
JavaWeb - GET 请求中 URL 的最大长度限制(附:解决方案)
JavaWeb - GET 请求中 URL 的最大长度限制(附:解决方案)
1012 0

热门文章

最新文章

下一篇
无影云桌面