如何获得已知Handle的窗体的所有子控件Handle? 如何探测浏览器页面中的密码框,并进行模拟输入?(200分)

  • 主题发起人 主题发起人 creation-zy
  • 开始时间 开始时间
C

creation-zy

Unregistered / Unconfirmed
GUEST, unregistred user!
&nbsp;如题,我的主要目的是要写一个 Single Sign On (单点登陆)工具,它必须能够探测到窗体/IE页面<br>中的密码输入框,并且实现模拟输入用户名/密码+按下“确定”按钮的功能。<br><br>&nbsp; 我现在实现了一个最基本过程,它能获得当前窗口句柄以及得到焦点的控件的部分信息:<br><br>var<br>&nbsp; LastFocusH:HWnd=0;<br>procedure CheckPwdWindow;<br>var<br>&nbsp; FocusH,WindowH,ChildH:HWnd;<br>&nbsp; ThreadH:dword;<br>&nbsp; Buf:array[0..1024]of Char;<br>&nbsp; Style:Integer;<br>&nbsp; Str:String;<br>&nbsp; procedure ShowCtrlInfo(H:HWnd);<br>&nbsp; begin<br>&nbsp; &nbsp; FillChar(Buf,1024,0);<br>&nbsp; &nbsp; SendMessage(H,WM_GETTEXT,1024,Integer(@Buf[0]));<br>&nbsp; &nbsp; Form1.Memo1.Lines.Add('内容: '+String(Buf));<br>&nbsp; &nbsp; FillChar(Buf,1024,0);<br>&nbsp; &nbsp; GetClassName(FocusH,@Buf[0],1024);<br>&nbsp; &nbsp; Form1.Memo1.Lines.Add('Class: '+String(Buf)+#13#10);<br>&nbsp; &nbsp; FillChar(Buf,1024,0);<br>&nbsp; &nbsp; Style:=GetWindowLong(H,GWL_STYLE);<br>&nbsp; &nbsp; Str:='Style: '+IntToHex(Style,8)+#13#10;<br>&nbsp; &nbsp; if Style and ES_NUMBER&gt;0 then<br>&nbsp; &nbsp; &nbsp; Str:=Str+' ES_NUMBER';<br>&nbsp; &nbsp; if Style and ES_PASSWORD&gt;0 then<br>&nbsp; &nbsp; &nbsp; Str:=Str+' ES_PASSWORD';<br>&nbsp; &nbsp; if Style and ES_MULTILINE&gt;0 then<br>&nbsp; &nbsp; &nbsp; Str:=Str+' ES_MULTILINE';<br>&nbsp; &nbsp; if Style and ES_READONLY&gt;0 then<br>&nbsp; &nbsp; &nbsp; Str:=Str+' ES_READONLY';<br>&nbsp; &nbsp; Form1.Memo1.Lines.Add(Str);<br>&nbsp; end;<br>begin<br>&nbsp; WindowH:=GetForegroundWindow;<br>&nbsp; if WindowH=Form1.Handle then<br>&nbsp; &nbsp; exit;<br>&nbsp; ThreadH:=GetWindowThreadProcessId(WindowH,nil);<br>&nbsp; AttachThreadInput(GetCurrentThreadId,ThreadH,true);<br>&nbsp; FocusH:=GetFocus;<br>&nbsp; if FocusH=LastFocusH then<br>&nbsp; &nbsp; exit<br>&nbsp; else<br>&nbsp; &nbsp; LastFocusH:=FocusH;<br>&nbsp; AttachThreadInput(GetCurrentThreadId,ThreadH,false);<br>&nbsp; if FocusH=0 then<br>&nbsp; &nbsp; Exit;<br>&nbsp; FillChar(Buf,1024,0);<br>&nbsp; SendMessage(WindowH,WM_GETTEXT,1024,Integer(@Buf[0]));<br>&nbsp; Form1.Memo1.Lines.Add('标题: '+String(Buf));<br>&nbsp; ShowCtrlInfo(FocusH);<br>end;<br><br>&nbsp; 但是在使用中发现,它不能获得IE页面内部的控件Handle。请高手指点!<br>&nbsp; 还有一个问题就是如何获得窗体的全部子控件?<br><br>&nbsp; 请大家帮忙提前,谢谢!!
 
好象有这方面的代码,你要search一下。
 
获得任意窗口和控件的类名和句柄 :<br><br>procedure TForm1.GetMousePosHwndAndClassName(Sender: TPoint);<br>var<br>&nbsp; hWnd: THandle;<br>&nbsp; aName: array [0..255] of char;<br>begin<br>&nbsp; hWnd := WindowFromPoint(Sender);<br>&nbsp; Label1.Caption := 'Handle : ' + IntToStr(hWnd);<br>&nbsp; if boolean(GetClassName(hWnd, aName, 256)) then<br>&nbsp; &nbsp; Label2.Caption := 'ClassName : ' + string(aName)<br>&nbsp; else<br>&nbsp; &nbsp; Label2.Caption := 'ClassName : not found';<br>end;<br><br>procedure TForm1.FormCreate(Sender: TObject);<br>begin<br>&nbsp; Form1.FormStyle := fsStayOnTop;<br>&nbsp; Timer1.Interval := 50;<br>end;<br><br>procedure TForm1.Timer1Timer(Sender: TObject);<br>var<br>&nbsp; rPos: TPoint;<br>begin<br>&nbsp; if boolean(GetCursorPos(rPos)) then<br>&nbsp; &nbsp; GetMousePosHwndAndClassName(rPos);<br>end;
 
&nbsp;好快呀! :)<br>&nbsp; 谢谢大家的热心帮助!<br><br>&nbsp; 我刚才可能没有将应用目标说清楚:<br>&nbsp; Single Sign On,它的目标是在用户进行一次性设定之后,以后每次弹出需要输入密码的窗体/页面时,<br>可以进行自动登录。它在系统的后台执行,监视系统中的当前窗体以及浏览器的页面,如果发现其中有<br>类似 ******* 的密码编辑框,就会自动填写用户预先定义的内容。<br>&nbsp; 比如,我用的是需要用户名和密码的代理上Internet,每新开一个窗口都会弹出一个框,要我输入用户<br>信息,有了SSO,就可以让它帮我自动完成了。<br><br>&nbsp; 卷兄的方法和当前的鼠标位置有关,实际应用中,不论鼠标现在在哪里,只要符合模式的窗口一出现,<br>就应当立刻输入相应信息。(比如:打开 sina 后自动输入用户名和密码进入免费邮箱)
 
获得窗体的全部子控件可以用EnumChildWindows简单搞定<br>但IE里的各种控件与普通窗体的是不同的,并不能用那些API轻松获得<br>好象要用到比较底层的东西<br>关注此题[:)]
 
获得一个窗口的句柄不是就可以对这个窗口进行修改,大小,形状、位置等?
 
IE里面的东西好像不是API轻易做到的事情.<br>溯雪能够监测到IE里面的框框们,不知道他是怎么搞的,<br>去问问小榕吧.[*D]
 
如何获取网页密码框中的密码?<br><br>http://www.vchelp.net/source/submit/get_html_password.htm<br><br>这里说得很详细,但是。。。。八成看完了你就没有干劲了:(<br>
 
我也正在研究,类似你这样的问题,但还没有你的深入!<br>不知你得到后,又怎样触发确认BUTTON呢?<br>我以前看过怎么搞WINZIP的AGREE BUTTON,但现在不知到哪儿去了?<br>这是我问的问题:<br>http://www.delphibbs.com/delphibbs/dispq.asp?lid=876572
 
先谢谢大家了! &nbsp;:)<br><br>&nbsp; 我大致看了一下 Shenxinaz 兄推荐的文章...<br>&gt;&gt;IHTMLDocument2接口<br>&nbsp; 弱项呀!看来要补课了...<br><br>to bubble:<br>&nbsp; 不知“小榕”是谁?还请示下联系方法。<br><br>to datoncg:<br>&gt;&gt;又怎样触发确认BUTTON呢?<br>&nbsp; 如果EnumChildWindows能够起作用的话,完全可以遍历窗体中的控件,找到“确认”按钮,<br>(用SendMessage(H,WM_GETTEXT,1024,Integer(@Buf[0]));可以获得按钮文本),然后发一个<br>回车键给它估计就搞定了!<br><br><br>&nbsp; 我待会儿就试验!
 
非常关注此题!<br><br>to creation-zy:<br>&nbsp; &nbsp;小榕是我国著名的电脑黑客,《流光》是他的大作。
 
下面是我的EnumChildWindows实验结果,很成功! 谢谢 xianjun 兄! :)<br><br>[00020594] &nbsp;Static &nbsp;标题 &nbsp;请键入用户名和密码。<br>[00020596] &nbsp;Static &nbsp;标题 &nbsp;防火墙:<br>[00020598] &nbsp;Static &nbsp;标题 &nbsp;101.236.50.173<br>[0002059A] &nbsp;Static &nbsp;标题 &nbsp;领域<br>[00020574] &nbsp;Static &nbsp;标题 &nbsp;用户名(&amp;U)<br>[00020576] &nbsp;Edit &nbsp;标题 &nbsp;123<br>[00020578] &nbsp;Static &nbsp;标题 &nbsp;密码(&amp;P)<br>[0002057A] &nbsp;Edit &nbsp;标题 &nbsp;123<br>[0002057C] &nbsp;Button &nbsp;标题 &nbsp;将密码存入密码表中(&amp;S)<br>[0002057E] &nbsp;Button &nbsp;标题 &nbsp;确定<br>[0002059C] &nbsp;Button &nbsp;标题 &nbsp;取消<br>[0002059E] &nbsp;Static &nbsp;标题 &nbsp;Software.<br><br>最新进展:<br>&nbsp; 用 SendMessage(hwnd,WM_SETTEXT,0,Integer(@MyText[1])); 设定编辑框的内容。<br>&nbsp; 用 SendMessage(hwnd,BM_CLICK,0,0); 点击“确定”按钮。
 
这个涉及到WebBrowse的Web编程,你这种方法不行的,我以前试过了,点击网页中的按钮,<br>要发送类似于Post之类的操作,有点类似于"登录奇兵"!
 
&gt;&gt;这种方法不行<br>&nbsp; 你的意思是不是:不能获得IE页面内部的Edit,Button等的Handle,或者不能向它们发送消息?
 
其实Shenxinaz贴出来的那个:<br>http://www.vchelp.net/source/submit/get_html_password.htm<br>文章里说得很清楚了!<br><br>照着做就行了, 也不难。<br><br>Shenxinaz: 一看名字我就想起你是谁了! 给你看一段话看你不记不记得: [:D]<br>procedure TForm1.N2Click(Sender: TObject);<br>begin<br>&nbsp; ShowMessage('NUS(No-Use-SoftWare)'+#13+<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'JUST Drag over and Release it '+#13+<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'Enable Every Handle,'+#13+<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'UnReadonly Every Handel,'+#13+<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'See Every ''*****'''+#13+<br>&nbsp; 'Please E-Mail to Shenxinaz@Hotmail.com for the Source-Code.')<br>end;<br>这是你99年写的代码吧, 找了好一会才从硬盘上翻出来! 嘿嘿...[:D]
 
ftp://delphi6789:cfik2e@delphi-tip.51.net/public_html/get_html_password.exe<br><br>照<br>http://www.vchelp.net/source/submit/get_html_password.htm<br>做的
 
我也有类似问题,但更加麻烦,需要用模拟键盘输入汉字!在网页中?<br>怎样处理?
 
大家看看这个小活<br>&nbsp;http://www.delphibbs.com/delphibbs/dispq.asp?lid=1217194
 
后退
顶部