做过ie编程的请进,关于拦截页面事件

DoItFreely 2003-02-07 10:47:21
偶想实现一个浏览器界面,给页面元素的事件加一段C++代码来处理,由于不怎么清楚COM/IE,请大家提示一下,谢谢!
取得页面元素的代码如下
void CIeUIView::OnDocumentComplete(LPCTSTR lpszURL)
{
CHtmlView::OnDocumentComplete(lpszURL);
AnalyzeHtmlPage();
}

void CIeUIView::AnalyzeHtmlPage()
{
CComPtr<IDispatch>pDisp;
pDisp = GetHtmlDocument();//取得页面的文档
if(!pDisp) return;//取不到
//获取文档接口
CComQIPtr<IHTMLDocument2,&IID_IHTMLDocument2>phd(pDisp);
if(phd)//获取文档接口成功
{
CComPtr<IHTMLElementCollection>phec;
if(SUCCEEDED(phd->get_all(&phec)))//获取所有元素成功
{
long lngCount = 0;
//确定元素总数
if(SUCCEEDED(phec->get_length(&lngCount)) && lngCount>=0)
{
IHTMLElement* phe;
IDispatch *pd;
VARIANT vaName;//元素的名称
VARIANT vaIdx;//元素的索引
vaName.vt = VT_INT;//整数类型
vaIdx.vt = VT_INT;//整数类型
//依次获取各个元素的IDispatch接口
for(long i=0;i<lngCount;i++)
{
pd = NULL;
vaIdx.intVal = i;
vaName.intVal = i;
if(SUCCEEDED(phec->item(vaName,vaIdx,&pd)))
{
if(pd)
{
if(SUCCEEDED(pd->QueryInterface(IID_IHTMLElement,(PVOID *)&phe)))
{
if(phe)
{
//=============================
//*****************************
//*******===问题在这里===******
//*****************************
//=============================
phe->Release();
}
}
pd->Release();
}
}
}
}
}
}
}
}

上面中间写着“问题在这”的地方有不懂的,请教各位:
1.怎么确定哪个元素是什么类型或名称的?比如,页面上有很多
<a href="..."></a>和button等等,我需要对不同元素
进行不同的处理。我用GetClassName()达不到目的,总是
得到一个空指针,不知道是不是用错了
2.比如我想调用phe->put_onlick()设置onclick()事件的处理函数,
需要一个IDispatch派生类的指针,并
实现它的Invoke()函数中的ID为DISPID_CLICK的处理,请问,我怎么获得/
生成这样一个派生类?我不想用ocx/dll,希望这个派生类对象只存在于
exe文件里面,而且不需要注册,怎么做?

偶一个帖最多给到200分,分数不够可以另开帖补上,哪位兄弟姐妹知道的,请不吝指教!有示例更好,不胜感激!
QQ: 7542023
E-mail: indep@263.net
yahoo和msn ID:都是illufe
九城ID: yleerF
...全文
160 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
DoItFreely 2003-02-26
  • 打赏
  • 举报
回复
问题已经解决,get_all()再item(_variant_t("item_name")),再put_on...()
使用类
Cxxx:public IDispatch
{
}
并重载几个纯虚函数就可以了,谢谢参与
DoItFreely 2003-02-10
  • 打赏
  • 举报
回复
太麻烦吗?请给点提示吧
zswzwy 2003-02-09
  • 打赏
  • 举报
回复
学习
DoItFreely 2003-02-09
  • 打赏
  • 举报
回复
再看看哦,偶不想用VS7,原因是……,装得人都晕倒了,刚装好,破MagicSet把破Win2000 Advanced Server搞破了,重装Win2000失败!再装,只能“全新安装”,吐血!
VC7确实可以ON_HTMLEVENT(...),VC6就头大了……
cheng_young 2003-02-08
  • 打赏
  • 举报
回复
1.get_tagName
2.事件处理可用脚本通过window.external调用C++方法, 可看看ATL HTML control向导生成的代码
flyycyu 2003-02-07
  • 打赏
  • 举报
回复
为什么不用CHTMLDialog呢?vc7得!
里面有很多映射宏,专门来做这件事情的!
DoItFreely 2003-02-07
  • 打赏
  • 举报
回复
thanks very much, Qestion 1 well answered.
but... it's not enough, i wanna apply a class instance to acknowledge the action of element on the page, for example,
i should like to implement a buton class to do something in c++ code more than script can do. this is the main reason i wan to use
c++ code interact with [d]html page
我想做的某些事,脚本做不到,才想使用C++来帮忙,并且整合到一个单一的exe里面,不用安装,也不用注册,使用以后也不需要留下注册表项垃圾。
我用ATL向导加入了一个COM组件,但是不能象C++对象一样实例化
有进一步的示范吗?

更进一步说,偶不懂Java/js/vbs/xml,所以不可能全部使用脚本来完成任务,我想做的并不是网页或浏览器,而是网页风格的应用程序,使用mfc的exe!

谢谢各位光顾和指导,新年快乐!
isdong 2003-02-07
  • 打赏
  • 举报
回复
#pragma warning(disable:4192)
#pragma warning(disable:4049)
#import "C:\WINNT\system32\mshtml.tlb"

The program changes the content of your HTML page dynamically (DHTML): All the elements you want to change must have an unique id. After the document is loaded completely, you can access each element like this:
//in derived CHtmlView-Class
MSHTML::IHTMLDocument2Ptr pDoc(GetHtmlDocument());
MSHTML::IHTMLElementPtr e(pDoc->Getall()->item
(_T("someElement")));
e->PutinnerText(_T("someText"));
//or
e->PutinnerHTML(_T("<b>someText</b>"));

masterz 2003-02-07
  • 打赏
  • 举报
回复
http://www.codeproject.com/dotnet/dhtmlview.asp
http://www.codeproject.com/dotnet/dhtmldialog.asp
also you can search walkall in microsoft

3,248

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧