首页
社区
课程
招聘
[求助]高手,接招,IE编程,WebBrowser activex object,CHtmlView
发表于: 2008-8-22 23:57 9996

[求助]高手,接招,IE编程,WebBrowser activex object,CHtmlView

2008-8-22 23:57
9996
主题:IE编程,VC++
编程方法:WebBrowser activex object,CHtmlView都行.
环境:IE develop,VC++
目的:通过鼠标点击得到网页中的元素
问题:怎么实现IE develop中的一个功能
功能描述为:通过单击得到网页中的元素

在IE Develop中使用方法为=>file=>Select Element by click
这样,可以用鼠标对网页中的元素进行选取,

请高手们接招解答,谢谢,

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 65
活跃值: (811)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
2
我不是高手!但是大一暑假在公司实习的时候,写过一个自动填表单的程序!可惜公司里的程序不让外带!我把我以前参考的程序部分发出来吧!

   希望对你有所帮助!

在不同的进程中取得IE的Webbrowser控件的IHTMLDocument2接口,请参阅MSDN上的一篇文章,标题是:HOWT Get IHTMLDocument2 from a HWND(根据HWND取得IHTMLDocument2接口).它的实现机理是向Webbrowser控件(窗口类名是"Internet
Explorer_Server")发一个WM_HTML_GETOBJECT,然后把返回值传给Microsoft Active Accessibility (MSAA) 函数ObjectFromLresult,这样你会取得一个已经编排(Marshaling)过的COM接口.如下函数所示:

IHTMLDocument2* GetDocInterface(HWND hWnd)
{
// 我们需要显示地装载OLEACC.DLL,这样我们才知道有没有安装MSAA
HINSTANCE hInst = ::LoadLibrary( _T("OLEACC.DLL") );
IHTMLDocument2* pDoc2=NULL;
if ( hInst != NULL )
{
if ( hWnd != NULL )
{
CComPtr spDoc=NULL;
LRESULT lRes; /*由于WM_HTML_GETOBJECT非Windows标准消息,所以需要RegisterWindowMessage*/
UINT nMsg = ::RegisterWindowMessage( _T("WM_HTML_GETOBJECT") );
::SendMessageTimeout( hWnd, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&lRes ); /*取得ObjectFromLresult函数的地址*/
LPFNOBJECTFROMLRESULT pfObjectFromLresult = (LPFNOBJECTFROMLRESULT)::GetProcAddress( hInst, _T("ObjectFromLresult") );
if ( pfObjectFromLresult != NULL )
{
HRESULT hr;
hr=pfObjectFromLresult(lRes,IID_IHTMLDocument,0,(void**)&spDoc);
if ( SUCCEEDED(hr) )
{
CComPtr spDisp;
CComQIPtr spWin;
spDoc->get_Script( &spDisp );
spWin = spDisp;
spWin->get_document( &pDoc2 );
}
}
}
::FreeLibrary(hInst);
} else
{//如果没有安装MSAA
AfxMessageBox(_T("请您安装Microsoft Active Accessibility"));
}
return pDoc2;
}
这样,我们就取得了IHTMLDocument2*接口了,要取得密码框的密码还得一番周折,首先得构造一个基于对话框的MFC程序,增加一个按钮,在主对话框类增加一个成员变量m_bCapture,在构造函数中初始化为FALSE.
然后处理该按钮的Click事件:

void CXXXXDlg::OnGetHtmlClick()
{
SetCapture();//跟踪鼠标
m_bCapture=TRUE;
}
接着应该处理WM_LBUTTONUP消息:

void CXXXXDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
if(m_bCapture)
{
m_bCapture=FALSE;
ReleaseCapture();//释放鼠标
static TCHAR buf[100];
POINT pt;
GetCursorPos(&pt);
HWND hwnd=::WindowFromPoint(pt);
if(hwnd!=NULL)
{
::GetClassName( hwnd, (LPTSTR)&buf, 100 );
if ( _tcscmp( buf, _T("Internet Explorer_Server") ) == 0 )
{
POINT iept=pt;
::ScreenToClient(hwnd,&iept);
GetPassword(GetDocInterface(hwnd),iept);
}
}
}
CDialog::OnLButtonUp(nFlags, point);
}
GetPassword函数是这样实现的,基本可以模仿VBScript的调用,但要复杂一些:

void GetPassword(IHTMLDocument2* pDoc2,POINT pt)
{
if(pDoc2==NULL)
return;
CComPtr pElement;
HRESULT hr=pDoc2->elementFromPoint(pt.x,pt.y,&pElement);//取得鼠标所在的元素
if(SUCCEEDED(hr))
{
CComPtr pPwdElement;
hr=pElement->QueryInterface(IID_IHTMLInputTextElement, (void**)&pPwdElement);//是否有表单输入元素

if(SUCCEEDED(hr))
{
CComBSTR type;
hr=pPwdElement->get_type(&type);
if(SUCCEEDED(hr))
{
if(type==_T("password")){//是密码框吗?
CComBSTR pwd;
hr=pPwdElement->get_value(&pwd);
if(SUCCEEDED(hr))
{
if(pwd.Length()!=0)
{//有密码则显示
CComBSTR msg=_T("密码是:");
msg+=pwd;
CString str(msg);
AfxMessageBox(str);
}
else
{
AfxMessageBox(_T("密码为空!"));
}
}
}
}
}
}
pDoc2->Release();
}
使用这种方法要注意:
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中已经有了,所以不用).
2.这种方法只适用用于Internet Explorer (Programming) versions 4.0, 4.01,
4.01 SP1, 4.01 SP2,
5
3.使用这种方法前要调用CoInitialize(NULL);然后应该相应地调用CoUninitialize();
4.Microsoft
Active Accessibility (MSAA)可从href="http://www.microsoft.com/enable/msaa/download.htm"
target=_blank>http://www.microsoft.com/enable/msaa/download.htm下载
2008-8-23 21:37
0
雪    币: 321
活跃值: (271)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
3
嗯,用accessibility的确不错。
2008-8-24 00:44
0
雪    币: 239
活跃值: (190)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
4
谢谢你的指点,不过,你的这种方法有些麻烦,
我现在想写一个程序,就是你可以自己定义填哪个地方,填表规则,然后自动填表并提交的程序
于是我就想实现像IE Develop那种,鼠标指向的地方,那么,那个地方的元素就会被画上一个与元素等大小的红色框,以标注些元素被选中,然后再分析出元素的类型,如果是input text那么,就可以确定为需要填写表单的地方,
我这次写的也是一个填写表单的程序,但这次环境不同,程序需要适应多个不同的网页环境,
但表单都差不多,输入用户名与密码就可以了,有点像扫号器哪种程序,
这个程序是针对至少五个以上的网页,所以我就想让用户自己去定义怎么填表,然后由程序自动记录并按一定的规则填表
2008-8-24 09:51
0
游客
登录 | 注册 方可回帖
返回
//