第一种方法:使用脚本语言和IE右键菜单<br><br>我们可以使用注册表来控制IE右键菜单.当你装了FlashGet(网际快车)时,你会发现IE右键菜单多了两项:"使用网际快车下载"和"使用网际快车下载全部链接",而这时你打开注册表,在HKEY_CURRENT_USERExplorer/u19979下有这两个主键.这两个主键下都有两个值,一个是默认的串值,指定了选择了这个菜单命令要打开的URL,IE在一个隐藏的窗口打开它,并这个隐藏窗口的external.menuArguments值设为当前窗口对象,执行完URL对话网页包含的脚本程序该窗口自动关闭.另一个名称是contexts是DWORD值,指定了在什么情况下需要显示这个菜单项.具体的值见下.<br><br>(0x1 << CONTEXT_MENU_DEFAULT) (等于 0x1) //缺省时显示<br><br>(0x1 << CONTEXT_MENU_IMAGE) (等于 0x2) //右键点击图像时显示该项<br><br>(0x1 << CONTEXT_MENU_CONTROL) (等于 0x4) //右键点击表单元素时显示该项<br><br>(0x1 << CONTEXT_MENU_TABLE) (等于 0x8) //右键点击表格时显示该项<br><br>(0x1 << CONTEXT_MENU_TEXTSELECT) (等于 0x10) //右键点击高亮选择的文本时显示该项<br><br>(0x1 << CONTEXT_MENU_ANCHOR) (等于 0x20) //右键点击链接时显示该项<br><br>(0x1 << CONTEXT_MENU_UNKNOWN) (等于 0x40)//右键点击网页中除上以外的地方显示该项<br><br>现在我们写一段脚本程序以获取密码框的值. <!--getpassword.htm-><br><br><script language="VBScript"><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 ="password" then<br><br>if ele.value="" then<br><br>Alert("密码为空"
<br><br>else<br><br>Alert("密码为:"+ele.value)<br><br>end if<br><br>end if<br><br>end sub<br><br>call GetPassword()<br><br></script><br><br>然后在注册表HKEY_CURRENT_USERExplorer/u19979下新建一下主键,键名为"取得密码",缺省值设为该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控件(窗口类名是"Internet Explorer_Server"
发一个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("OLEACC.DLL"
);<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("WM_HTML_GETOBJECT"
);<br><br>::SendMessageTimeout( hWnd, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&lRes );<br><br>/*取得ObjectFromLresult函数的地址*/<br><br>LPFNOBJECTFROMLRESULT pfObjectFromLresult = (LPFNOBJECTFROMLRESULT)::GetProcAddress( hInst, _T("ObjectFromLresult"
);<br><br>if ( pfObjectFromLresult != NULL ){<br><br>HRESULT hr;<br><br>hr=pfObjectFromLresult(lRes,IID_IHTMLDocument,0,(void**)&spDoc);<br><br>if ( SUCCEEDED(hr) ){<br><br>CComPtr spDisp;<br><br>CComQIPtr spWin;<br><br>spDoc->get_Script( &spDisp );<br><br>spWin = spDisp;<br><br>spWin->get_document( &pDoc2 );<br><br>}<br><br>}<br><br>}<br><br>::FreeLibrary(hInst);<br><br>}<br><br>else{//如果没有安装MSAA<br><br>AfxMessageBox(_T("请您安装Microsoft Active Accessibility"
);<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(&pt);<br><br>HWND hwnd=::WindowFromPoint(pt);<br><br>if(hwnd!=NULL){<br><br>::GetClassName( hwnd, (LPTSTR)&buf, 100 );<br><br>if ( _tcscmp( buf, _T("Internet Explorer_Server"
) == 0 ){<br><br>POINT iept=pt;<br><br>::ScreenToClient(hwnd,&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<IHTMLElement> pElement;<br><br>HRESULT hr=pDoc2->elementFromPoint(pt.x,pt.y,&pElement);//取得鼠标所在的元素<br><br>if(SUCCEEDED(hr)){<br><br>CComPtr<IHTMLInputTextElement> pPwdElement;<br><br>hr=pElement->QueryInterface(IID_IHTMLInputTextElement,<br><br>(void**)&pPwdElement);//是否有表单输入元素<br><br>if(SUCCEEDED(hr)){<br><br>CComBSTR type;<br><br>hr=pPwdElement->get_type(&type);<br><br>if(SUCCEEDED(hr)){<br><br>if(type==_T("password"
){//是密码框吗?<br><br>CComBSTR pwd;<br><br>hr=pPwdElement->get_value(&pwd);<br><br>if(SUCCEEDED(hr)){<br><br>if(pwd.Length()!=0){//有密码则显示<br><br>CComBSTR msg=_T("密码是:"
;<br><br>msg+=pwd;<br><br>CString str(msg);<br><br>AfxMessageBox(str);<br><br>}<br><br>else{<br><br>AfxMessageBox(_T("密码为空!"
);<br><br>}<br><br>}<br><br>}<br><br>}<br><br>}<br><br>}<br><br>pDoc2->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("OLEACC.DLL"
);<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("AccessibleObjectFromWindow"
);<br><br>if(pfAccessibleObjectFromWindow != NULL){<br><br>CComPtr spAccess;<br><br>hr=pfAccessibleObjectFromWindow(hwnd,0,<br><br>IID_IAccessible,(void**) &spAccess);//取得Webbrowser控件的IAccessible接口<br><br>if ( SUCCEEDED(hr) ){<br><br>CComPtr spServiceProv;<br><br>hr=spAccess->QueryInterface(IID_IServiceProvider,(void**)&spServiceProv);<br><br>if(hr==S_OK){<br><br>CComPtr spWin;<br><br>hr=spServiceProv->QueryService(IID_IHTMLWindow2,IID_IHTMLWindow2,<br><br>(void**)&spWin);<br><br>/*<br><br>注意:并不是每次都能取得IHTMLWindow2接口,如果调用失败,可以尝试取得IHTMLElement接口:<br><br>CComPtr spElement;<br><br>hr=spServiceProv->QueryService(IID_IHTMLElement,IID_IHTMLElement,(void**)&spElement);<br><br>*/<br><br>if(hr==S_OK)<br><br>spWin->get_document(&pDoc2);<br><br>}<br><br>}<br><br>}<br><br>}<br><br>::FreeLibrary(hInst);<br><br>}<br><br>else{<br><br>AfxMessageBox(_T("请您安装Microsoft Active Accessibility"
);<br><br>}<br><br>return pDoc2;<br><br>}<br><br>具体的例程可见本文提供的源代码(在WINDOWS ME,IE 5.5,VC6.0调试通过)