关于ie编程的问题,拦截页面上某个按钮事件 ( 积分: 200 )

  • 主题发起人 主题发起人 GoldenMan
  • 开始时间 开始时间
G

GoldenMan

Unregistered / Unconfirmed
GUEST, unregistred user!
譬如:一个网页上有一个发送的按钮,怎样去截获该按钮的事件,将其绑定在程序的某个按钮上,当点击程序的按钮时,就相当于点击了该网页的发送按钮?
 
譬如:一个网页上有一个发送的按钮,怎样去截获该按钮的事件,将其绑定在程序的某个按钮上,当点击程序的按钮时,就相当于点击了该网页的发送按钮?
 
邦定没有办法,在WebBrower里面点击按钮就有办法,不管楼主要不要,我先帖上
界面上放一个WebBrower1和一个BitBtn1

unit Main;

interface

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

type
TForm1 = class(TForm)
WebBrowser1: TWebBrowser;
BitBtn1: TBitBtn;
procedure BitBtn1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure WebBrowser1DownloadComplete(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
FDownComplete : Boolean;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.BitBtn1Click(Sender: TObject);
var
ovDoc, ovInput, ovTag: OleVariant;
I : Integer;
begin
if not FDownComplete then Application.MessageBox('网页正在下载中,请稍后……', '提示', MB_OK + MB_ICONINFORMATION)
else begin
ovDoc := WebBrowser1.Document;
ovInput := ovDoc.all.tags('FORM');
for I := 0 to ovInput.length -1 do begin
ovTag := ovInput.item(I);
if (ovTag.Type = 'text') or (ovTag.Type = 'password') then begin
if ovTag.Name = 'ID' then ovTag.Value := '113';
if ovTag.Name = 'passwd' then ovTag.Value := '******';
end
else if ovTag.Type = 'image' then begin
if ovTag.alt = '登录ChinaRen' then
ovTag.Click;
end;
end;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
FDownComplete := False;
WebBrowser1.Navigate('http://www.cng.com.cn/');
end;

procedure TForm1.WebBrowser1DownloadComplete(Sender: TObject);
begin
FDownComplete := True;
end;

end.
 
ShellExecute(... '*.html ...)
 
首先取得网页的源码,
看一下,得到按钮的名称,
一般是象这样:
<TD><INPUT class=za_button type=submit value=OK name=Submit2>
我们知道了: name=Submit2
然后,在你自己的按钮onclick事件中:
var o : OleVariant;
doc : IHTMLDocument2;
begin
doc := WebBrowser1.document as IHTMLDocument2;
o := doc.all.item('Submit2',0);
o.click;
 
to chenybin:
你的代码运行时出现“Method 'Type' not supported by automation object.”

to stlont:
可以详细点吗,如果一个网页内有两个name=Submit2,那怎区分?谢
 
procedure TForm1.FormCreate(Sender: TObject);
begin
FDownComplete := False;
WebBrowser1.Navigate('http://www.cng.com.cn/');
end;


这里写错了

应该是
procedure TForm1.FormCreate(Sender: TObject);
begin
FDownComplete := False;
WebBrowser1.Navigate('http://www.chinaren.com/');
end;
这样就没问题了
如果还有问题留下联系方式
 
to chenybin:
改变网址仍然出现同样的错误。我想应该不是跟网站的关系吧

QQ:420015225
email:kyo@superdata.com.cn
 
看看可不可以分析网页,找到按钮的链接,这在webbrowser的某个事件(具体忘了)的URL参数可以获得,然后直接用Navigate导入这个链接不行么??没试过,不过可以考虑!
 
不幸被楼主说中了,就是和网站有关系,下面哪些uid,fm等等都是我从html代码里面找出来的,这种东西怎么可能和网站没关系呢,如果网页变了,代码自然就失效了。

这个代码曾经帮助过许多朋友解决问题,原理基本上差不多,比如下面的uid这个名字和form的名字FM,以前网页只有一个form,所以不需要单独判断,现在需要单独加上

procedure TForm1.BitBtn1Click(Sender: TObject);
var
ovDoc, ovForm, ovInput, ovTag: OleVariant;
I : Integer;
begin
if not FDownComplete then Application.MessageBox('网页正在下载中,请稍后……', '提示', MB_OK + MB_ICONINFORMATION)
else begin
ovDoc := WebBrowser1.Document;
ovForm := ovDoc.forms;// 取得当前html的所有form,和上面的代码差别不大,方式不同而已
for I := ovForm.length - 1 downto 0 do begin
if ovForm.item(I).Name = 'FM' then begin//取登录的form
ovInput := ovform.Item(I);
Break;
end;
end;

for I := 0 to ovInput.length -1 do begin// 在这个登录的循环里面找属于form的元素
ovTag := ovInput.item(I);// 取得对应元素
if (ovTag.Type = 'text') or (ovTag.Type = 'password') then begin
if ovTag.Name = 'uid' then ovTag.Value := 'chenybin';
if ovTag.Name = 'passwd' then ovTag.Value := '******';
end
else if ovTag.Type = 'image' then begin// 如果是图片而且标题是如下的话就点击,限制好像点击不了,不知道我哪里写错了,但是前面两个值已经填写进去了
if ovTag.alt = '登录ChinaRen' then
ovTag.Click;// 这句最关键了,就是点击,所以可以把上面的判断修改成ovTag.Type = 'button',即如果是按钮如何如何,在我的这个例子里面用form的submit效果是一样的
end;
end;
end;
end;

工程已经发送到你的油箱了,请查收
 
晕,挣这份真不容易,再写

procedure TForm1.BitBtn1Click(Sender: TObject);
var
ovDoc, ovForm, ovInput, ovTag: OleVariant;
I : Integer;
begin
if not FDownComplete then Application.MessageBox('网页正在下载中,请稍后……', '提示', MB_OK + MB_ICONINFORMATION)
else begin
ovDoc := WebBrowser1.Document;
ovForm := ovDoc.forms;
for I := ovForm.length - 1 downto 0 do begin
if ovForm.item(I).Name = 'form' then begin
ovInput := ovform.Item(I);
Break;
end;
end;

for I := 0 to ovInput.length -1 do begin
ovTag := ovInput.item(I);
if (ovTag.Type = 'text') or (ovTag.Type = 'password') then begin
if ovTag.Name = 'user' then ovTag.Value := 'chenybin';
if ovTag.Name = 'pass' then ovTag.Value := 'xxxxxx';
end
else if (ovTag.Type = 'submit') and (ovTag.Name = 'enter.x') then begin
ovTag.Click;
end;
end;
//ovInput.Submit;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
FDownComplete := False;
WebBrowser1.Navigate('http://www.126.com/');
end;
 
[:D]哈!chenybin辛苦了!
用delphi代码触发WebBrowser里的事件是容易的,反过来,WebBrowser的事件驱动delphi
里的代码是比较难的!chenybin老兄是否做过?
 
没弄过,WebBrower里面提供了几个事件,如果够就好了,不够我也不知道怎么弄,另外MSHTML单元里面有HTMLWindowEvents = dispinterface
['{96A0A4E0-D062-11CF-94B6-00AA0060275C}']
procedure onload; dispid 1003;
procedure onunload; dispid 1008;
function onhelp: WordBool; dispid -2147418102;
procedure onfocus; dispid -2147418111;
procedure onblur; dispid -2147418112;
procedure onerror(const description: WideString; const url: WideString; line: Integer); dispid 1002;
procedure onresize; dispid 1016;
procedure onscroll; dispid 1014;
procedure onbeforeunload; dispid 1017;
procedure onbeforeprint; dispid 1024;
procedure onafterprint; dispid 1025;
end;这样的接口,你看怎么用起来,还有分送不
-----------------------------
不好意思,刚刚看错了,我以外是楼主呢,原来是yeskert1大虾,俺也只是懂点皮毛,就等楼主发分了
 
chenybin辛苦了,这里很感谢chenybin兄弟,我先将分送出
 
谢谢你,chenybin!
将来会有很多问题想你请教的!
 
后退
顶部