电脑爱好者,提供IT资讯信息及各类编程知识文章介绍,欢迎大家来本站学习电脑知识。 最近更新 | 联系我们 RSS订阅本站最新文章
电脑爱好者
站内搜索: 
当前位置:首页>> C++/VC>>C++下WebBrowser使用全接触:

C++下WebBrowser使用全接触

来源:www.cncfan.com | 2006-1-20 | (有9489人读过)

在日常的开发程序的过程中,经常会遇到使用IE的问题,使用IE一般有两种情况,一种是像监视GMmail信箱讲到的那样,另外一种是类似与CrazyBrowser这样的使用webbrowser控件的程序。
其实在程序中使用WebBrowser其实是一件很简单的事情,因为有WebBrowser可以直接使用,但是能用和用起来可不是一样的事情。下面就经常会用到的一些功能简单的介绍介绍。

1.最经常使用的自然如何屏蔽默认的IE右键菜单,并且使用自定义的菜单。这方面网上有很多的文章进行说明,我就不献丑了。因为我采用的办法据说是最没有创意的办法。在PreTranslateMessage中判断。

2.其实大多数情况下,我们还需要动态的去设置Webbrowser控件中的HTML属性,类似于自动填表之类的软件,这样的代码与监视GMmail信箱中使用的方法类似。

3.我们知道在类似的程序中,我们一般都要去截取在WebBrowser中的一些javascript事件,比如adblock这样的软件就需要截取window.open这样的代码,如果我们在自己的程序中使用IE控件的话,我们会希望IE页面里的Button Text Link就和我们在form中创建的Button,Text,Link完全一样的被我们轻松自如的控制。
最早打算去创建一个全局的Hook来监视这样的操作,但是这样做一个是太麻烦,接口过于复杂,而且也不是标准的做法。

通过查看MSDN,发现其实MSHTML其实是提供了这样的接口(与其说是MSHTML提供的接口,不如说是COM提供的接口),我用下面的代码来演示 如何来截取一个href超文本链接的操作。

ON_EVENT(CDialog1, IDC_EXPLORER1, 259, DocumentCompleteExplorer1, VTS_DISPATCH VTS_PVARIANT)

以便我们可以在所有的文档加载完成后,来分析整个的文档,然后通过监视GMmail信箱中介绍的办法找到我们要监视的Href
if(strId.Find(cstrLink,0) != -1){
IHTMLAnchorElement * pButtonElem = NULL;
hr = pDisp->QueryInterface(IID_IHTMLAnchorElement, (void **)&pAnchorElem);
HiJackHref(pAnchorElem);
}
在HiJackHref的代码中,我们通过如下的操作
hr = pAnchorElem ->QueryInterface(IID_IConnectionPointContainer, (void**)&pCPC);

if (hr == S_OK)

{
hr = pCPC->FindConnectionPoint(DIID_HTMLAnchorEvents2, &pCP);
if (hr == S_OK)
{
if (m_pHtmlEvent)
{
delete m_pHtmlEvent;
m_pHtmlEvent =NULL;
}
m_pHtmlEvent = new HtmlEvent;
m_pHtmlEvent ->SetParent(this);
IUnknown* pUnk = m_pHtmlEvent 2->GetInterface(&IID_IUnknown);
hr = pCP->Advise(pUnk, &dwCookie);
pCP->Release();
}
pCPC->Release();
}
至此,我们已经成功地在我们form和html之间建立起来了一座桥梁,我们只要用标准的COMEvent
就可以简单方便的处理所有的html事件了,下面列出一些常用的事件


"HTMLELEMENTEVENTS2_ONCLICK", DISPID_HTMLELEMENTEVENTS2_ONCLICK

"HTMLELEMENTEVENTS2_ONMOUSEOVER", DISPID_HTMLELEMENTEVENTS2_ONMOUSEOVER

"HTMLELEMENTEVENTS2_ONMOUSEMOVE", DISPID_HTMLELEMENTEVENTS2_ONMOUSEMOVE

"HTMLELEMENTEVENTS2_ONDBLCLICK", DISPID_HTMLELEMENTEVENTS2_ONDBLCLICK

"HTMLELEMENTEVENTS2_ONMOUSEUP", DISPID_HTMLELEMENTEVENTS2_ONMOUSEUP

"HTMLELEMENTEVENTS2_ONMOUSEDOWN", DISPID_HTMLELEMENTEVENTS2_ONMOUSEDOWN


好了,这个问题到此就结束一大半了,为什么说是一大半而不是全部呢?大家首先要回忆一下前面的红色文字,我们这样做的最大问题就是,如果我通过DHTML增加了一个Element以后,HiJack的程序就不能截取了,只能通过重新HiJack一次了,这样多不方便呀,显然不是豆腐的作风。

告诉大家一个小诀窍,可以为我们需要操纵的Element设置一个同样名称的自定义属性,比如vid,然后再定义一个vname,这样就在DocumentCompleteExplorer1去Hook vid为特定数值的Element 然后再HtmlEvent根据vname进行不同的操作。
至此,问题全部解决,剩下的就靠你自己了。



Note:

好久没有更新自己的Blog了,开心也一再的催,不过实在是没有办法,最近这小半年的时间实在是太忙了,等到有时间了,会和各位朋友一起分享自己的心得。

C++/VC热门文章排行
网站赞助商
购买此位置

 

关于我们 | 网站地图 | 文档一览 | 友情链接| 联系我们

Copyright © 2003-2024 电脑爱好者 版权所有 备案号:鲁ICP备09059398号