搜索文章:

首页  |  Java技术  |  Asp.net  |  Asp编程  |  VC/C++  |  Delphi  |  VB编程
上一篇:Serv-u6.0提权新招 >>

WebBrowser使用全接触

在日常的开发程序的过程中,经常会遇到使用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进行不同的操作。
至此,问题全部解决,剩下的就靠你自己了。

()

相关文章:
© 2006   www.java-asp.net