如何知道浏览器当前的url地址?(100分)

  • 主题发起人 主题发起人 elan
  • 开始时间 开始时间
E

elan

Unregistered / Unconfirmed
GUEST, unregistred user!
我想获得浏览器当前正在使用的url地址,不知该怎么做?请给一个例子,
要求对ie和netscape都有效。
应该不太难吧。
 
如何用Delphi编程控制IE

元林
  用Delphi编程控制IE的方法很多,最方便的大概就数
DDE和ActiveX。尽管今天还谈论DDE(Dynamic Data Exch
ange)似乎有点显得过时,实际上为了保持兼容性,从古
老的Excel3.0,到最新的IE4.0,Microsoft都仍然支持DD
E。下面就让我们首先看看如何使用极短的Delphi代码,
用DDE来控制IE的运行。

  第一步,应该确保IE已经运行,DDE无法与一个没有
运行的程序进行数据交换,这只需一句Delphi代码:

  HlinkNavigateString(ComObject,′http://www.bor
land.com′);

  //该函数在UrlMon中定义

  执行后,IE就会自动启动,并进入www.borland.com
网页。接下来我们就可以用DDE来控制IE了。

  创建一DDEClientConv控件,取名为DDEClientConv1
,一个Edit控件,取名为Edit1。

  //使IE浏览www.microsoft.com

   DdeClientConv1.SetLink(′iexplore′,′WWW—
OpenURL′);

   DdeClientConv1.OpenLink;

   DdeClientConv1.RequestData(′www.

  microsoft.com');

   DdeclientConv1.CloseLink;

   //激活最近打开的IE

   DdeClientConv1.SetLink(′iexplore′,′WWW—
Activate′);

   DdeClientConv1.OpenLink;

   DdeClientConv1.RequestData(′0′);

   DdeclientConv1.CloseLink;

   //在Edit1中显示最近打开的IE所浏览的网址名


   //如:″http://www.microsoft.com/″,″Mic
rosoft Home Page″

   DdeClientConv1.SetLink(′iexplore′
,′WWW—GetWindowInfo′);

   DdeClientConv1.OpenLink;

   edit1.text:=DdeClientConv1.RequestDat
a(′WWW—GetWindowInfo′);

   DdeclientConv1.CloseLink;

   //关闭最近打开的IE

   DdeClientConv1.SetLink(′iexplore′,′WWW—
Exit′);

   DdeClientConv1.OpenLink;

   DdeClientConv1.RequestData(′WWW—Exit′);

   DdeclientConv1.CloseLink;

  Microsoft 的Internet Explorer不但被设计成一个D
DE服务器,它同样还是一个ActiveX(即以前的OLE)自动
操作服务器,如果你偏爱Microsoft推崇倍至的ActiveX,
我们同样可以用它来控制IE,但系统开销要比使用DDE大
一些,让我们也来看看一个简单的例子:

   procedure TForm1.Button1Click(Sender: TObj
ect);

   var

   app: Variant;

   begin

   app := CreateOleObject(′InternetExplore
r.Application′);

   app.navigate(′http://www.borland

  .com′);

   app.visible:=TRUE;

   end;

  这里我们创建了一个IE的实例,并且让其浏览www.bo
rland.com网页,其中navigate是IE对象的方法,visible
是IE对象的属性,其它几个重要的方法及属性还有:

  GoBack 相当于IE菜单中的Back按钮

  GoForward 相当于IE菜单中的Forward按钮

  GoHome 相当于IE菜单中的Home按钮

  GoSearch 相当于IE菜单中的Search按钮

  Refresh 相当于IE菜单中的Refresh按钮

  Stop 相当于IE菜单中的Stop按钮

  LocationURL 返回当前的URL

  Quit 关闭此IE实例

  关于IE对象模型的其它具体细节可以从Microsoft得
到,本文不再详述。

  以上代码在Delphi3.0及IE3.0中测试通过,Internet
Explorer4.0与此类似,只是DDE的Topic和Item有一些小
的区别
 
我想获得的是当前ie窗口中的url地址。所以我改成

app := CreateOleObject(′InternetExplorer.Application′);

但是运行是出错。另外,对于开多个窗口的情况,应该如何处理?
 
//运行是出错
什么错误?
 
来自:huizhang 时间:00-3-23 07:47:09 ID:204221

procedure TForm1.Button3Click(Sender: TObject);
var
ShellWindow: IShellWindows;
nCount: integer;
spDisp: IDispatch;
i: integer;
vi: OleVariant;
IE1: IWebBrowser2;
IDoc1: IHTMLDocument2;
begin
ShellWindow := CoShellWindows.Create;
nCount := ShellWindow.Count;

for i := 0 to nCount - 1 do
begin
vi := i;
spDisp := ShellWindow.Item(vi);
spDisp.QueryInterface( iWebBrowser2, IE1 );
if IE1 <> nil then
begin
memo1.Lines.Add( 'Location: '+ie1.LocationName );

IE1.Document.QueryInterface(IHTMLDocument2,iDoc1);
if iDoc1 <> nil then
begin
memo1.Lines.add( 'Title: ' + IDOC1.Title );
memo1.Lines.add( 'Url: ' + IDOC1.url);
end;
end;
end;
end;

 
to :DreamTiger

我无法编译你的这段程序, IHTMLDocument2 应该引用哪个 Unit?谢谢!
 
DreamTiger 我已经解决了。

但是当url地址变更时,能不能接收到通知呢?
 
如果还要获得 netscape navigator 以及 opera 的url地址,该如何做到呢?
 
url地址变了,我也不知道怎么知道.用Timer定时检查?
netscape和opera我就没辙了.
 
TO DreamTiger:
你得到的是浏览器当前所有打开的URL,如果只想得到当前活动的URL呢?
 
To阿群:
当前活动的URL,沈前卫的例子中就有吧。
 
偶用bho解决了,各位辛苦一场,先给大家分吧。

faint,偶每次给分都那么慷慨,偏偏挣不到分


呵呵。想知道答案的可以拿分来换。
 
Uses
DdeMan;

procedure TForm1.Button1Click(Sender: TObject);
var
//IE也差不多。

DDE: TDdeClientConv;
begin
DDE := TDdeClientConv.Create(self);
if DDE.SetLink( 'Netscape', 'WWW_GetWindowInfo' ) then
Edit1.Text := DDE.RequestData( '0xFFFFFFFF, sURL, sTitle' )
else
ShowMessage( 'Netscape is not running' );
DDE.Free;
end;
 
to elan:bho是什么。能说明一下吗?
我只知道IE的解决方法,以下程序返回前台IE正在访问网页的的URL的TITLE。希望对您能有一些帮助。
//writer by liguang
//in 2000-03-17
unit ligwin1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
control,KeyId:integer;
hotkeyid:ATOM;
public
{ Public declarations }
procedure WMHOTKEY(var Msg:TMessage);message WM_HOTKEY;
end;

var
Form1: TForm1;
ThisUrl:PChar;

implementation

{$R *.DFM}


function EnumChildWindowsProc(H:HWnd;lparam:longint):Boolean;stdcall;
var
Buffer: array[0..10] of Char;
begin
Result:=True;
GetClassName(h,buffer,10);
if trim(StrPas(Buffer))='Edit' then
begin
SendMessage(h,WM_GETTEXT,249,Integer(ThisUrl));
Result:=False;
end;
end;

procedure TForm1.WMHOTKEY(var Msg:TMessage);
var
h:HWND;
buffer:array[0..256] of char;
temp:String;
begin
if (Msg.LParamHi=KeyId) and (Msg.LParamLo=control) then
begin
Msg.Result:=1;
h:=GetForegroundWindow;
GetClassName(h,buffer,255);
if StrPas(buffer)='IEFrame' then
begin
EnumChildWindows(h,@EnumChildWindowsProc,0);
GetWindowText(h,buffer,255);
buffer[Pos(' - ',buffer)]:=Char(0);
temp:='当前网页的URL是:'+ThisUrl+#13#10+'当前网页Title是:'+buffer;
MessageBox(h,PChar(temp),'提示信息',MB_OK)
end;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ThisUrl:=StrAlloc(250);
control:=MOD_CONTROL or MOD_SHIFT ;KeyId:=$43;
hotkeyid:=GlobalAddAtom('UserDefineHotKey')-$C000;
RegisterHotKey(Handle,hotkeyid,control,KeyId);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
UnregisterHotKey(Handle,hotkeyid);
DeleteAtom(hotkeyid);
end;

end.
 
谢谢 liguang

不过解决这个问题还是用m$的所谓bho的东东,用com实现的。可以知道ie各个窗口的url、html下载完毕的通知等等事件。各位可以去m$的网站找一下相关资料,偶看了几天e问,头都大了,不行,要休息了!
 
看了不会白看的。如果你能开个话题,讲讲你是怎么解决的,
以及你的心得体会,我可以出200 分。如果你觉得不够,可
以再加。
 
沈前卫:我回去再去弄弄netscape看看
 
ok 等偶把那个东东在整理整理好不好?实际上现在还有一些小bug
 
bho是什么东东我不知道...但是IE我是控制过的。
不过是在VC里。反正都一样。

Create一个IE的 control出来,invoke一个IWebBrowerEvents 出来,
然后为这个Interface写事件处理。比如OnTitleChanges,onStatus之类的,
具体叫什么的忘记啦 :)

然后,去loadurl,当load成功之后,就去取html的元素。什么都可以取到啦。
甚至可以随便更换元素,想改什么就该什么。多好?

由于是2个月前写的啦,细节都忘记了。有时间我翻译成delphi吧。
告诉大家我是在MSJ上找到的一个完整的例子改的。
有兴趣的话到MSj上去search "WebView"

msj = microsoft joural.
在microsoft站上。


 
后退
顶部