确是是非高手莫进,也许这儿就只有10人能解答。网页中的程序弹出对话框,怎么获取弹出对话框的信息?(100分)

  • 主题发起人 主题发起人 1Fuyi
  • 开始时间 开始时间
1

1Fuyi

Unregistered / Unconfirmed
GUEST, unregistred user!
怎样获取浏览弹出对话框的信息?

用WebBrowser编程
网页中的程序弹出对话框,怎么获取弹出对话框的信息?

举例说明,你申请一个会员,弹出对话框有可以告知用户申请成功,或密码长度不够,
在程序中怎么才能获取弹出框的信息.???

有什么时侯找到WebBrowser弹出的对话框,
也就是怎么获取WebBrowser弹出对话框的事件?


 
先用findwindow找住程序的hwnd,然后再用findwindowex找那个程序弹出的框应该可以吧
 
具体一点!!!针对性强一点

以下方法都能弹出对话框的。
alert
prompt
open
confirm
showModalDialog
showModelessDialog
createPopup
你想得到哪一种的?????
 
我也问过几次了,但是就是没答案! jsxjd  能否说详细一点??
 
我的想法:
第一:IE中弹出对话框的捕捉是一个常用的任务。
第二:弹出对话框的可能有:jsxjd 所说的
alert,prompt,open,confirm,showModalDialog,
showModelessDialog,createPopup 等
因为服务器端设计是别人设计的,他可能改变,
所以,以上的可能都要想到。
第三:用 白河愁 之方法的问题是:
你在什么时候用Findwindow方法进行查找,
也就是说,你怎么知道这个弹出对话框弹出了?

 
怎么又问啊? 去看我对你上个问题的回答吧。
我试了一下,用timer取到了一些text,如
“请按照系统提供的附加码。。。。。。
”请输入用户名。。。
“你输入的密码错误。。。

呵呵,你还在弄那个传奇的网站吗?
他们什么时候弹出来,你应该知道的
因为是你申请一个会员后的结果,
申请后启动一个timer, 监视有没有
你要的窗口就可以了。会出现什么
窗口你也应该知道的,发现窗口就可以
抓内容做对比了。 这个不难搞的,
有问题继续讨论吧。
我都跟你说过了,分太少这些家伙不会理你的,
心理界限是100分。几十分的有人点都不点,:)
 
TO:stlont
老兄,我试试你的办法 。
要成了,上家会给我好我钱的
听说是10000网元。
 
ft. 强烈要求分钱!
btw: 网元是干什么用的?
 
网元就是网上的支付手段。
至少可以购 N 张传奇卡的。
 
可惜我不玩传奇。
不过我帮朋友搞网吧,倒是看到
不少人在玩。我手上有套他的服务器程序,
没装过。据说私服太多,买卡的人少了。
 
当然,除了购传奇,还可购很多东东,比如QQ卡,163邮箱........
也许有一天当当书店也支持网元,那时你就想要网元了。
 
俺觉得findwindow可以的, 可以 hook 窗口创建的消息。然后祛判断。
 
>> 俺觉得findwindow可以的, 可以 hook 窗口创建的消息。然后祛判断。
主窗口是IE或一个Twebbrowser
子窗口是弹出对话框。

试试,不行,找各位高手要源码。
 
俺这里有 最初 写 广告条杀手 的 源代码,不过因为有点问题加上 大学毕业找工作
找到工作 很忙就一直没有时间 过她, 你要么?原理应该是一样的.
 
还不行? 给你原码啦。 我是在我的project里面给你加了
段代码测试,所以不能全拷上来,其实只要几句关键代码
就够了:
1. 放个timer, Enabled先false, webbrowser装入完页面
后打开timer:
procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
begin
Timer2.Enabled:=true;
end;
2. timer中监视对话框,发现了就取对话框的信息。
以你上次的传奇网站http://61.151.255.12/login.php
为例:(其中的function gettext是dwf里被人贴了无数遍的,:)
procedure TForm1.Timer2Timer(Sender: TObject);
var
Hnd: hwnd;
Function GetText(WindowHandle: hwnd):string;
var
txtLength : integer;
buffer: string;
begin
TxtLength := SendMessage(WindowHandle, WM_GETTEXTLENGTH, 0, 0);
txtlength := txtlength + 1;
setlength (buffer, txtlength);
sendmessage (WindowHandle,wm_gettext, txtlength, longint(@buffer[1]));
result := buffer;
end;
begin
hnd:=FindWindow('#32770',nil); //取对话框
StatusBar1.panels[0].text:=gettext(hnd); //对话框标题
StatusBar1.panels[1].text:='hnd:'+inttostr(hnd); //对话框hwnd
hnd:=FindWindowEx(hnd ,0,'static',nil); //这是个图标
Hnd := GetWindow(Hnd, GW_HWNDNEXT); //这是显示信息
StatusBar1.panels[2].text:='next:'+gettext(hnd); //取显示信息文本
StatusBar1.panels[3].text:='hnd:'+inttostr(hnd);
end;

这么简单的问题,你开了好几帖不停的问,还老是说高难,高难
其实。。。。。。如果你一帖给出300分,早就over啦,[:D][:D][:D]
不知道你有没有dfw的离线数据库,在里面是可以查到数百帖有关
findwindow的讨论的,不过还是那句话:那些想当然没上机验证过
的别信。还有:“非高手莫进,也许这儿就只有10人能解答”这样的
提问也会使一些人不舒服,特别是没弄过答不了的大瞎们,连踢你一
脚都不愿,怕被人知道。[:D][:D][:D]
 
用timer怕是 太 。。。
俺个人觉得不行。至少不好,不应该。
 
经测试你的代码确实能找到对话框的内容。谢谢。

但是 事件驱动 的问题还是未解决。

因为对话框的产生主要是客户单击 网页上的 提交按纽 后产生的,
也就是 TTimer 在什么时候激活。

另一个问题是Timer的时长定为多少,要是服务器反应慢了,TTimer捕捉不到信息,怎么处理。
 
看看我上面的代码,就有TTimer激活的事件。Timer的时长定为多少
没有多大关系的,我是缺省的1秒。服务器反应快慢也没有关系,
TTimer捕捉不到信息,不管就是了,我给的代码你要根据需要加多
些判断和处理啊。 如果找不到,hnd=0。
而且我这个方法可以对付上面jsxjd说的什么
alert
prompt
open
confirm
showModalDialog
showModelessDialog
createPopup
等等等,因为你不管弹出的原因,只管结果。
至于人在昆明,说话不要吞吞吐吐,这是技术
论坛么,有什么高见直说,不怕说错,大家讨论,
要骂也直骂,为什么太 。。。不行。不好,不应该
至少给个理由吧。
我也考虑过hook, webbrowser事件,消息捕捉等,
但觉得在这个问题上不如timer简单直接,其实那些
说到底原理也一样,要知道windows是个多任务系统
timer是最重要的,发的最多的消息就是wm_timer和wm_paint。
这里我给出两个思路:
1. 消息捕捉: 对话框弹出时是置顶的,一般有setfocus消息
wm_setfocus或按钮的setfocus
2. webbrowser事件:用CommandStateChange
不过这里要注意,delphi 5的常量定义文件有个问题
CSC_UPDATECOMMANDS在编译时有个出界警告,不理他就是了。

 
用FindWindow+EnumChildWindows试试, 应该能行的
 
to: stlont
你知道我为什么要获取弹出对话框的信息吗?
因为我想知道我用程序进行提交后的,服务器返回的结果,
》》》我是缺省的1秒。服务器反应快慢也没有关系,
》》》TTimer捕捉不到信息,不管就是了
这样是不行的,我的提交如果没有成功,我就应再次提交。
所以我特别关心TTimer时长。你这个方案不能完全解决我的问题。
还是要找到IE弹出事件为最好。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部