如何用程序实现获得当前ie窗口内地址框内的网址?(100分)

  • 主题发起人 主题发起人 shuoshuoshuo
  • 开始时间 开始时间
S

shuoshuoshuo

Unregistered / Unconfirmed
GUEST, unregistred user!
请问:

我想获得当前所有ie窗口的地址框内的网址,请问用delphi如何实现?

最好有程序例子,谢谢!
 
呵呵

问题的标题是:如何取得当前IE窗口的URL和TITLE(50分)
问题的分类是:OLE / Automation , 分坛主: houyg, 分坛主: lhz 来自:
liguang 时间:00-3-15 15:20:20 ID:200223

同题.这个问题我急着解决.只要能解决,不管是你自己答和或者是从论坛以前记
录中贴的,都给分.


来自:wjiachun 时间:00-3-15 15:33:55 ID:200225
来自:sunstone 时间:00-3-12 07:57:04 ID:198292
这分怎吗分?

我的例子

//callback过程,用于查找窗口控件
function EnumChildWindowsProc(H: HWnd; lparam: longint): Boolean; stdcall;
var
Buffer: array[0..10] of Char;
begin
Result := True; //設定為True才會再找下一個
getclassname(h,buffer,10);
if trim(StrPas(Buffer))='Edit' then
begin
ThisUrl:= StrAlloc(250);
SendMessage(h,WM_GETTEXT,249,Integer(ThisUrl));
Result:=False;//設定為false不找下一個
end;
end;

procedure GetUrl;
begin
EnumChildWindows(getforegroundwindow, @EnumChildWindowsProc, 0);
end;



来自:liguang 时间:00-3-18 09:57:17 ID:201746
wjiachun兄你好:
你的答案正常,现在问题已经全部解决.这里50分就全给你了.


 
wjiachun:
Just copy and paste.Congratulation!
 
Kang:
呵呵,来了,我要上课了,你去帮千中元减肥吧……
 
<pre> 问题的标题是:我想替换某个应用程序Edit的文本,我该...(100分)<br>问题的分类是:Windows API , 分坛主: houyg, 分坛主: cAkk 来自:愚夫 时间:00-1-11 21:57:46 ID:174557 <br>我想在一个Button的Click中,替换(或输入)IE等浏览器竹叶中Edit的文字,<br>使用SendMessage发送EM_REPLACESEL时,需要知道浏览器应用程序的Handle,<br>还是焦点Edit的Handle?如何获得?<br> <br>来自:huizhang 时间:00-3-22 23:22:59 ID:204106 <br>IE 浏览器本身是一个COM服务程序, 可以用SHDocVw.dll中定义的IWebBrowser2得到<br>他的指针, 或者用CoInternerExplorer.Create来新建一个. 要对浏览器进行完全控<br>制, 可以Import MSHTML.DLL, 里面有所有的浏览器的各个元素的COM定义. 通过<br>MSHTML中的IHTMLDocument, 可以得到一个网页里面所有的详细内容.<br><br>Uses ComObj, MSDocW_TLB, MSHTML_TLB;<br><br>var<br> IE: IWebBrowser2;<br> IDOC: IHTMLDocument2;<br> Title: string;<br>procedure StartIE;<br>var Address, p1, p2, p3, p4: OleVariant;<br>begin<br> IE := CoInternetExplorer.Create; //启动IE浏览器<br> IE.Visible := true; //显示浏览器<br> Address := 'www.microsoft.com'; //浏览地址<br> IE.Navigate(Address,p1,p2,p3,p4);//浏览<br> ......<br> IDOC := IE.Document; //获得Document<br> Title:= IDOC.Title; //取得网页的Title<br> ......<br>end;<br><br>procedure CloseIE;<br>begin<br> IE.Quit;<br>end;<br><br>要完全控制浏览器的内容, 不要忘记Implement浏览器DWebBrowserEvents2中的事件<br>DocumentComplete.<br> <br><br>--------------------------------------------------------------------------------<br>来自:huizhang 时间:00-3-23 07:47:09 ID:204221 <br>to cAkk:<br><br>哈哈, 你真令俺老人家生气, 告诉你们用IHTMLDocument就足够了. 这里给你们一个<br>简单的例子, 从IShellWindows(同样在SHDocVw.DLL中)提取IE, 以及其标题, URL.<br>至于想替换HTML中的Form, 甚至Script语言, 都可以在IHTMLDocument下做文章得<br>到.<br><br>想用Windows的API函数得到IE的窗口是根本不可能的, 因为IE的HTML窗口以及其中<br>的控件根本没有注册到Windows的ROT(running object table). 所有的信息都在<br>IHTMLDocument之中, 多花点时间研究一下吧.<br><br><br>Uses<br> SHDocVw, MSHTML;<br><br>procedure TForm1.Button3Click(Sender: TObject);<br>var<br> ShellWindow: IShellWindows;<br> nCount: integer;<br> spDisp: IDispatch;<br> i: integer;<br> vi: OleVariant;<br> IE1: IWebBrowser2;<br> IDoc1: IHTMLDocument2;<br>begin<br> ShellWindow := CoShellWindows.Create;<br> nCount := ShellWindow.Count;<br><br> for i := 0 to nCount - 1 do<br> begin<br> vi := i;<br> spDisp := ShellWindow.Item(vi);<br> spDisp.QueryInterface( iWebBrowser2, IE1 );<br> //或者用: IE1 := spDisp as IWebBrowser2;<br> if IE1 <> nil then<br> begin<br> memo1.Lines.Add( 'Location: '+ie1.LocationName );<br><br> //IDoc1 := IE1.Document as IHTMLDocument2;<br> IE1.Document.QueryInterface(IHTMLDocument2,iDoc1);<br> if iDoc1 <> nil then<br> begin<br> memo1.Lines.add( 'Title: ' + IDOC1.Title );<br> memo1.Lines.add( 'Url: ' + IDOC1.url);<br> end;<br> end;<br> end;<br>end;<br><br>//注释(By DreamTiger)<br>//用IDoc1 := IE1.Document as IHTMLDocument2;会在运行中出错,<br>//系统如果装了ie5,那么,浏览文件夹的时候,<br>//spDisp.QueryInterface( iWebBrowser2, IE1 );可以得到IE1,但是<br>//ie1中并没有ihtmldocument2接口,用as会导致出现exception。<br>//用QueryInterface比较安全。<br><br> </pre><br>

 
想得到IE的当前网址,只要用DDE就可以乐.

dreamtiger: huizhang的这个方法可能不实用这个问题. 地址烂不属于
IE的COM吧? just a combobox.
 
cAkk:用DDE的在哪个问题里说过,我去学习学习。
用huizhang的方法么,我主要觉得可能ie.url会比地址栏更有用,呵呵。
 
来自:cAkk 时间:00-2-7 22:34:35 ID:183924
最好的办法是通过DDE得到浏览器正在访问的URL:

function URLInfo(sBrowerPrgFile, sServiceName: string; Netscape: boolean; var Title: string): pChar;
{
参数说明:
sBrowerPrgFile: 浏览器exe文件的完整路径名
sServiceName: 浏览器的DDE-Service名字
Netscape是'Netscape',IE是'iexplore'
Title: 返回当前网页的title
返回值: pChar的字符串
}
var
DDEClientConv: TDDEClientConv;
StartPtr, EndPtr: pchar;
browserWinName: string;
begin
result:= #0;
Title:= '';

if (sBrowerPrgFile = '') or (not FileExists(sBrowerPrgFile)) then
raise EBrowserNotFoundError.create('****!浏览器应用程序不存在!');

ddeClientConv:= TDDEClientConv.Create( nil );
try
with ddeClientConv do
begin
ServiceApplication := sBrowerPrgFile;
SetLink( sServiceName,'WWW_GetWindowInfo');
StartPtr:= RequestData('0xFFFFFFFF');
end;
finally
ddeClientConv.Free;
end;

if startPtr^ = #0 then
exit;
{skip leading "}
inc(StartPtr);
EndPtr:= StartPtr;
{proceed to next "}
while (EndPtr^ <> '"') do
inc(EndPtr);
{terminate URL string}
EndPtr^:= #0;
result:= StartPtr;
{skip ","}
StartPtr:= EndPtr+3;
if Netscape then
inc(StartPtr,12);

EndPtr:= StartPtr;
if Netscape then
while (EndPtr^ <> ']') do
inc(EndPtr)
else
while (EndPtr^ <> '"') do
inc(EndPtr);

EndPtr^:= #0;
Title:= strPas(StartPtr);
end;


呵呵


 
http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=160780
 
我用这个函数有些问题啊,Title总是不全。
跟踪下来是:
StartPtr:= RequestData('0xFFFFFFFF');
得不到全长的Title,得到的是:
'"http://www.gislab.ecnu.edu.cn/delphibbs/","大富翁'
应该是
'"http://www.gislab.ecnu.edu.cn/delphibbs/","大富翁论坛"'才对
是我的机器出了问题?
 
wjiachun:

你的例子中 DDEClientConv: TDDEClientConv;
为什麽老报错,是不是需要在uses中加一条语句?
加什麽?

 
注册表里有没有?
 
DreamTiger: 没有的事,我这里很正常.

授受手: uses DdeMan;
 
cakk:

你好,请原谅我的愚蠢,我还想知道浏览器exe文件的完整路径名是什麽意思?
是ie所在的目录吗?
 
cakk:
告诉我你写的URLInfo函数怎麽使!举个例子!谢谢~!
URLinfo('???','iexplore',False,'???')
请说明问号部分!谢谢

 
procedure TForm1.Button1Click(Sender: TObject);
var
sUrl,sTitle:string;
begin
sUrl := String(URLInfo('D:/Program Files/Plus!/Microsoft Internet/IEXPLORE.EXE','iexplore',false,sTitle));
ShowMessage(sUrl + #13 + sTitle);
end;


 
对不起,我知道我很烦!但我还是想问!
Raise EBrowserNotFoundError.Create('****!浏览器应用程序不存在!');
报错!undeclared identifier:'EbrowserNotfounderror'
是不是也要在uses里加什麽语句?


请问:编译通过后,一运行到while (endptr^<>'"') do inc(endptr);
就报错!为什么?
Project project1.exe raised exception class EaccessViolation with
message 'Access violation at address 00401A50 in module 'project1.exe'. Read of address 01194000'.
 
while(endptr^ <> '"') do inc(endptr);
我是改成了
while(endptr^ <> '"') and (endptr^ <> #0) do inc(endptr);
估计你的问题跟我一样,StartPtr:= RequestData('0xFFFFFFFF');
没能得到完整的结果。
 
你呀你呀,EBrowserNotFoundError不会用,你就不会注释掉? 反正用处不大.

在Type部分里面添加这句话
EBrowserNotFoundError = Exception;

>>>while (endptr^<>'"') do inc(endptr);
这句话出错不太可能,你用的什么浏览器? 这个程序没有在netscape下严格测试过.
 
我用的是ie!
 
后退
顶部