豆腐生活

豆腐的平静生活
随笔 - 129, 评论 - 906, 引用 - 60

导航

关于

豆腐制作 都是精品

每月存档

最新留言

广告

 

在日常的开发程序的过程中,经常会遇到使用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了,开心也一再的催,不过实在是没有办法,最近这小半年的时间实在是太忙了,等到有时间了,会和各位朋友一起分享自己的心得。

打印 | 张贴于 2005-04-08 11:08:00 | Tag:暂无标签

留言反馈

#回复: WebBrowser使用全接触 编辑
精品源于豆腐制作
2007-11-19 16:57:00 | [匿名:火狐浏览器]
#回复: WebBrowser使用全接触 编辑
68286426
2007-04-15 15:25:00 | [匿名:qwee]
#回复: WebBrowser使用全接触 编辑
54687451624
2007-04-15 15:24:00 | [匿名:qwee]
#回复: WebBrowser使用全接触 编辑
向您请教一个问题:如果公司的网站提供数据查询功能,我想实现在界面中用VBA自动填入顺序的时间,接着后台服务器查询到数据并新开一窗口提供下载链接,再用VBA自动实现下载。
2006-12-23 16:21:00 | [匿名:我考百试通]
#re: WebBrowser使用全接触 编辑
en
2006-10-08 23:48:00 | [匿名:影视制作,宣传片制作,影视广告制作]
#re: WebBrowser使用全接触 编辑
如果在调用WebBrowser不让显示选择打印机的窗口,
document.all.WebBrowser.ExecWB(6,6)在我winXP下面还是会出现选择打印的窗口!!
2006-07-24 12:01:00 | [匿名:树上蹭灰]
#re: WebBrowser使用全接触 编辑
请教二个问题:
1.如何去掉webbrowser.navigate 时系统发出的声音.
2.webbrowser在加载文档时鼠标指针会变成等待状,如何才能使鼠标指针不发生变化。
谢谢!
2006-07-07 03:33:00 | [匿名:hegexing]
#re: WebBrowser使用全接触 编辑
楼上怎么还有广告啊?
2006-04-07 18:34:00 | [匿名:99魔术网]
#re: WebBrowser使用全接触 编辑
reretr

2006-02-05 18:24:00 | [匿名:dd]
#re: WebBrowser使用全接触 编辑
学到不少东西,谢谢!
2005-11-18 02:13:00 | [匿名:top20]
#re: WebBrowser使用全接触 编辑
豆腐兄,向你请教一个问题,我现在想获取网页中焦点所在元素的坐标,该怎么做啊,这是为了实现TAB键控制焦点的移动,同时鼠标的指针移动到相应的位置,这个问题困扰了我好几天,该怎么实现。

谢谢了,请将方法发送到我的邮箱coolroads@126.com
非常感谢
2005-06-22 14:27:00 | [匿名:龙]
#re:WebBrowser使用全接触 编辑
WebBrowser使用全接触ooeess
2005-06-02 11:56:00 | [匿名:补偿导线]
#re: WebBrowser使用全接触 编辑
字太小了。不明!
2005-04-28 09:48:00 | [匿名:压力变送器]
#re:WebBrowser使用全接触 编辑
^_~,pretty good!18showsseeoo
2005-04-25 23:06:00 | [匿名:自动化监控系统]
#re: WebBrowser使用全接触 编辑
现佩服一下上面那位仁兄!看来已经完成了传说中的识别图片文字的程序。
久违了,豆腐兄。如果单单是分析HTML网页,是不是可以使用CHttpConnection和CInternetSession/CHttpFile,我已经完成了一个拙劣的CHttpSession类,来实现公司的Sign,嘿嘿。
2005-04-11 10:17:00 | [匿名:luo31]
#WebBrowser使用全接触 编辑
^_^,Pretty Good!
2005-04-08 12:18:00 | [匿名:测汞]
对不起,目前本随笔不允许发表新评论.

Powered by: Joycode.MVC引擎 0.5.2.0