高分求怎样用Delphi获取网页输入框中的密码 ( 积分: 100 )

  • 主题发起人 主题发起人 95588
  • 开始时间 开始时间
9

95588

Unregistered / Unconfirmed
GUEST, unregistred user!
不要给我发VC的例子,VC写出来几十K,Delphi写出来就几百K。<br>真正实践过的朋友才有发言权<br>方法越巧妙越好,<br>欢迎大家来讨论,<br>分我能给多少就给多少,或通过其他方式补偿。
 
不要给我发VC的例子,VC写出来几十K,Delphi写出来就几百K。<br>真正实践过的朋友才有发言权<br>方法越巧妙越好,<br>欢迎大家来讨论,<br>分我能给多少就给多少,或通过其他方式补偿。
 
没实践过,不过我知道一点儿,没什么妙的方法,要么用DOM,分析文档结构,获得密码(?不知道可不可以得到即时输入的密码)<br>要么用HOOK截键盘消息,现成的API是没有的了
 
谢谢参与
 
第一种方法:使用脚本语言和IE右键菜单<br><br>我们可以使用注册表来控制IE右键菜单.当你装了FlashGet(网际快车)时,你会发现IE右键菜单多了两项:&quot;使用网际快车下载&quot;和&quot;使用网际快车下载全部链接&quot;,而这时你打开注册表,在HKEY_CURRENT_USERExplorer/u19979下有这两个主键.这两个主键下都有两个值,一个是默认的串值,指定了选择了这个菜单命令要打开的URL,IE在一个隐藏的窗口打开它,并这个隐藏窗口的external.menuArguments值设为当前窗口对象,执行完URL对话网页包含的脚本程序该窗口自动关闭.另一个名称是contexts是DWORD值,指定了在什么情况下需要显示这个菜单项.具体的值见下.<br><br>(0x1 &lt;&lt; CONTEXT_MENU_DEFAULT) (等于 0x1) //缺省时显示<br><br>(0x1 &lt;&lt; CONTEXT_MENU_IMAGE) (等于 0x2) //右键点击图像时显示该项<br><br>(0x1 &lt;&lt; CONTEXT_MENU_CONTROL) (等于 0x4) //右键点击表单元素时显示该项<br><br>(0x1 &lt;&lt; CONTEXT_MENU_TABLE) (等于 0x8) //右键点击表格时显示该项<br><br>(0x1 &lt;&lt; CONTEXT_MENU_TEXTSELECT) (等于 0x10) //右键点击高亮选择的文本时显示该项<br><br>(0x1 &lt;&lt; CONTEXT_MENU_ANCHOR) (等于 0x20) //右键点击链接时显示该项<br><br>(0x1 &lt;&lt; CONTEXT_MENU_UNKNOWN) (等于 0x40)//右键点击网页中除上以外的地方显示该项<br><br>现在我们写一段脚本程序以获取密码框的值. &lt;!--getpassword.htm-&gt;<br><br>&lt;script language=&quot;VBScript&quot;&gt;<br><br>Sub GetPassword()<br><br>set srcEvent = external.menuArguments.event<br><br>Set doc=external.menuArguments.document<br><br>set ele=doc.elementFromPoint( srcEvent.clientX, srcEvent.clientY )<br><br>if ele.type =&quot;password&quot; then<br><br>if ele.value=&quot;&quot; then<br><br>Alert(&quot;密码为空&quot;)<br><br>else<br><br>Alert(&quot;密码为:&quot;+ele.value)<br><br>end if<br><br>end if<br><br>end sub<br><br>call GetPassword()<br><br>&lt;/script&gt;<br><br>然后在注册表HKEY_CURRENT_USERExplorer/u19979下新建一下主键,键名为&quot;取得密码&quot;,缺省值设为该htm文件的路径,在该主键下另增一个DWORD值,值为4,表示只在右击表单元素时显示该项.关闭注册表,重新启动IE窗口,点击一下密码框,就会出现该项,点击该项,弹出一个对话框,告诉你的密码.<br><br>第二种方法:使用VC来实现<br><br>由于VC知识库是一个关于C++以及Visual C++的网站,与脚本语言没什么关系。所以我们要用另一种稍微复杂一点的方法来实现相同的事情,那就是用C++来做。在不同的进程中取得IE的Webbrowser控件的IHTMLDocument2接口,请参阅MSDN上的一篇文章,标题是:HOWTO: Get IHTMLDocument2 from a HWND(根据HWND取得IHTMLDocument2接口)(http://support.microsoft.com/default.aspx?scid=kb;EN-US;q249232).它的实现机理是向Webbrowser控件(窗口类名是&quot;Internet Explorer_Server&quot;)发一个WM_HTML_GETOBJECT,然后把返回值传给Microsoft Active Accessibility (MSAA) 函数ObjectFromLresult,这样你会取得一个已经编排(Marshaling)过的COM接口.如下函数所示:<br><br>IHTMLDocument2* GetDocInterface(HWND hWnd)<br><br>{<br><br>// 我们需要显示地装载OLEACC.DLL,这样我们才知道有没有安装MSAA<br><br>HINSTANCE hInst = ::LoadLibrary( _T(&quot;OLEACC.DLL&quot;) );<br><br>IHTMLDocument2* pDoc2=NULL;<br><br>if ( hInst != NULL ){<br><br>if ( hWnd != NULL ){<br><br>CComPtr spDoc=NULL;<br><br>LRESULT lRes;<br><br>/*由于WM_HTML_GETOBJECT非Windows标准消息,所以需要RegisterWindowMessage*/<br><br>UINT nMsg = ::RegisterWindowMessage( _T(&quot;WM_HTML_GETOBJECT&quot;) );<br><br>::SendMessageTimeout( hWnd, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&amp;lRes );<br><br>/*取得ObjectFromLresult函数的地址*/<br><br>LPFNOBJECTFROMLRESULT pfObjectFromLresult = (LPFNOBJECTFROMLRESULT)::GetProcAddress( hInst, _T(&quot;ObjectFromLresult&quot;) );<br><br>if ( pfObjectFromLresult != NULL ){<br><br>HRESULT hr;<br><br>hr=pfObjectFromLresult(lRes,IID_IHTMLDocument,0,(void**)&amp;spDoc);<br><br>if ( SUCCEEDED(hr) ){<br><br>CComPtr spDisp;<br><br>CComQIPtr spWin;<br><br>spDoc-&gt;get_Script( &amp;spDisp );<br><br>spWin = spDisp;<br><br>spWin-&gt;get_document( &amp;pDoc2 );<br><br>}<br><br>}<br><br>}<br><br>::FreeLibrary(hInst);<br><br>}<br><br>else{//如果没有安装MSAA<br><br>AfxMessageBox(_T(&quot;请您安装Microsoft Active Accessibility&quot;));<br><br>}<br><br>return pDoc2;<br><br>}<br><br>这样,我们就取得了IHTMLDocument2*接口了,要取得密码框的密码还得一番周折,首先得构造一个基于对话框的MFC程序,增加一个按钮,在主对话框类增加一个成员变量m_bCapture,在构造函数中初始化为FALSE.<br><br>然后处理该按钮的Click事件: void CXXXXDlg::OnGetHtmlClick()<br><br>{<br><br>SetCapture();//跟踪鼠标<br><br>m_bCapture=TRUE;<br><br>}<br><br>接着应该处理WM_LBUTTONUP消息: void CXXXXDlg::OnLButtonUp(UINT nFlags, CPoint point)<br><br>{<br><br>if(m_bCapture){<br><br>m_bCapture=FALSE;<br><br>ReleaseCapture();//释放鼠标<br><br>static TCHAR buf[100];<br><br>POINT pt;<br><br>GetCursorPos(&amp;pt);<br><br>HWND hwnd=::WindowFromPoint(pt);<br><br>if(hwnd!=NULL){<br><br>::GetClassName( hwnd, (LPTSTR)&amp;buf, 100 );<br><br>if ( _tcscmp( buf, _T(&quot;Internet Explorer_Server&quot;) ) == 0 ){<br><br>POINT iept=pt;<br><br>::ScreenToClient(hwnd,&amp;iept);<br><br>GetPassword(GetDocInterface(hwnd),iept);<br><br>}<br><br>}<br><br>}<br><br>CDialog::OnLButtonUp(nFlags, point);<br><br>}<br><br>GetPassword函数是这样实现的,基本可以模仿VBScript的调用,但要复杂一些: void GetPassword(IHTMLDocument2* pDoc2,POINT pt)<br><br>{<br><br>if(pDoc2==NULL)return;<br><br>CComPtr&lt;IHTMLElement&gt; pElement;<br><br>HRESULT hr=pDoc2-&gt;elementFromPoint(pt.x,pt.y,&amp;pElement);//取得鼠标所在的元素<br><br>if(SUCCEEDED(hr)){<br><br>CComPtr&lt;IHTMLInputTextElement&gt; pPwdElement;<br><br>hr=pElement-&gt;QueryInterface(IID_IHTMLInputTextElement,<br><br>(void**)&amp;pPwdElement);//是否有表单输入元素<br><br>if(SUCCEEDED(hr)){<br><br>CComBSTR type;<br><br>hr=pPwdElement-&gt;get_type(&amp;type);<br><br>if(SUCCEEDED(hr)){<br><br>if(type==_T(&quot;password&quot;)){//是密码框吗?<br><br>CComBSTR pwd;<br><br>hr=pPwdElement-&gt;get_value(&amp;pwd);<br><br>if(SUCCEEDED(hr)){<br><br>if(pwd.Length()!=0){//有密码则显示<br><br>CComBSTR msg=_T(&quot;密码是:&quot;);<br><br>msg+=pwd;<br><br>CString str(msg);<br><br>AfxMessageBox(str);<br><br>}<br><br>else{<br><br>AfxMessageBox(_T(&quot;密码为空!&quot;));<br><br>}<br><br>}<br><br>}<br><br>}<br><br>}<br><br>}<br><br>pDoc2-&gt;Release();<br><br>}<br><br>使用这种方法要注意:<br><br>1.如果程序在Windows95,98和NT 4.0 Service With Pack 4 or 5下运行必须要把Microsoft Active Accessibility (MSAA)运行时组件(RDK)与程序一起发布(Windows2000及Windows NT 4.0 Service With Pack 6中已经有了,所以不用).<br><br>2.这种方法只适用用于Internet Explorer (Programming) versions 4.0, 4.01, 4.01 SP1, 4.01 SP2, 5<br><br>3.使用这种方法前要调用CoInitialize(NULL);然后应该相应地调用CoUninitialize();<br><br>4.Microsoft Active Accessibility (MSAA)可从http://www.microsoft.com/enable/msaa/download.htm下载<br><br>附:<br><br>我们也可以使用Active Accessibility(MSAA)获取IHTMLDocument2*接口,见下程序:<br><br>/*函数名:GetDocInterfaceByMSAA<br><br>参数:hwnd,WebBrowser控件的窗口句柄<br><br>功能:取得hwnd对应的Webbrowser控件的IHTMLDocument2*接口.<br><br>*/ IHTMLDocument2* GetDocInterfaceByMSAA(HWND hwnd)<br><br>{<br><br>HRESULT hr;<br><br>HINSTANCE hInst = ::LoadLibrary( _T(&quot;OLEACC.DLL&quot;) );<br><br>IHTMLDocument2* pDoc2=NULL;<br><br>if ( hInst != NULL ){<br><br>if ( hwnd != NULL ){<br><br>//取得AccessibleObjectFromWindow函数<br><br>LPFNACCESSIBLEOBJECTFROMWINDOW pfAccessibleObjectFromWindow =<br><br>(LPFNACCESSIBLEOBJECTFROMWINDOW)::GetProcAddress(hInst,_T(&quot;AccessibleObjectFromWindow&quot;));<br><br>if(pfAccessibleObjectFromWindow != NULL){<br><br>CComPtr spAccess;<br><br>hr=pfAccessibleObjectFromWindow(hwnd,0,<br><br>IID_IAccessible,(void**) &amp;spAccess);//取得Webbrowser控件的IAccessible接口<br><br>if ( SUCCEEDED(hr) ){<br><br>CComPtr spServiceProv;<br><br>hr=spAccess-&gt;QueryInterface(IID_IServiceProvider,(void**)&amp;spServiceProv);<br><br>if(hr==S_OK){<br><br>CComPtr spWin;<br><br>hr=spServiceProv-&gt;QueryService(IID_IHTMLWindow2,IID_IHTMLWindow2,<br><br>(void**)&amp;spWin);<br><br>/*<br><br>注意:并不是每次都能取得IHTMLWindow2接口,如果调用失败,可以尝试取得IHTMLElement接口:<br><br>CComPtr spElement;<br><br>hr=spServiceProv-&gt;QueryService(IID_IHTMLElement,IID_IHTMLElement,(void**)&amp;spElement);<br><br>*/<br><br>if(hr==S_OK)<br><br>spWin-&gt;get_document(&amp;pDoc2);<br><br>}<br><br>}<br><br>}<br><br>}<br><br>::FreeLibrary(hInst);<br><br>}<br><br>else{<br><br>AfxMessageBox(_T(&quot;请您安装Microsoft Active Accessibility&quot;));<br><br>}<br><br>return pDoc2;<br><br>}<br><br>具体的例程可见本文提供的源代码(在WINDOWS ME,IE 5.5,VC6.0调试通过)
 
http://www.netyi.net/in.asp?id=zsh1213
 
不是我想要的答案 我想要Delphi的代码
 
接受答案了
 
后退
顶部