在日常的开发程序的过程中,经常会遇到使用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进行不同的操作。
[1] [2]
至此,问题全部解决,剩下的就靠你自己了。
(出处:http://www.sheup.com)
[1] [2]