CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  ATL/ActiveX/COM

如何得到IE中选定区域的html源码?

楼主8bean(Junior)2002-11-06 19:25:01 在 VC/MFC / ATL/ActiveX/COM 提问

问题是这样的:  
                我用WebBrowser2控件打开一个Web页,用鼠标选定一片区域,将其拖放到一个编辑框内,编辑框内为选定区域的html源码,不知如何实现?并且如何截获拖放消息?希望高手指点. 问题点数:100、回复次数:22Top

1 楼lllhaier(从C++菜鸟到JAVA菜鸟之旅)回复于 2002-11-06 19:31:00 得分 0

通过IHtmlDocument接口你可以得到整个网页的html源码,然后我想你可以通过分析源码得到吧!Top

2 楼lllhaier(从C++菜鸟到JAVA菜鸟之旅)回复于 2002-11-06 19:32:12 得分 0

你可以用鼠标钩子截获拖放消息呀!具体的你可以看看这方面的资料.不难的!Top

3 楼8bean(Junior)回复于 2002-11-06 19:34:24 得分 0

to   IIIhaier:  
              我的想法是选定后,在做拖动时,发送Ctrl+C消息,将其复制到剪贴板里,然后就可以得到其Html源码,但是考虑到这样对别人的程序有影响,觉得不好,有没有其他方法?讨论一下!Top

4 楼8bean(Junior)回复于 2002-11-06 19:35:26 得分 0

用钩子得到是其显示文本,不是源码.Top

5 楼iicup(双杯献酒)回复于 2002-11-06 19:40:08 得分 0

不失为一种思路。Top

6 楼microran2000(什么时候才能看到星星?)回复于 2002-11-06 20:30:35 得分 0

基于消息的钩子函数并不是解决万事万物的灵丹妙药,对于基于COM或者是DOM文档对象模型的网页来说,解析网页应该挂接网页的事件对象,网页中每个元素都提供了一个onSelectStart事件,很多防范的网页会设置这个事件,防止用户选中当前的网页的文本,在这样网页中用户是无法加亮某些文字的。  
        最好的方法是熟悉IE   的组件开发技术,基于COM的程序越来越多,单纯依靠原来的SDK   钩子函数、API   HOOK   以及消息拦截越来越不吃香。  
        建议熟悉BHO   DeskBand   ToolBand   MenuExt   TOOLBar   ContextMenu等IE插件的开发技术。熟悉组件开发技术,比如ATL。  
      你上面的问题可以借助于事件网页元素的事件连接点实现。可以参考IHTMLElement事件接口。  
  Top

7 楼8bean(Junior)回复于 2002-11-06 20:36:54 得分 0

to   microran2000:  
              1.IHTMLDocument2  
              2.调用IHTMLDocument2::get_selection   Method   得到IHTMLSelectionObject  
              3.调用IHTMLSelectionObject::createRange   Method得到IDispatch.  
              4.然后就不知怎么做了.(在JavaScript中,可以用document.selection.createRange().innerHTML得到,但Vc里我不知道,希望指教.Top

8 楼microran2000(什么时候才能看到星星?)回复于 2002-11-07 08:10:50 得分 0

关于使用createRange方法,我的确没有用过,不具有发言权。我参考了一下MSDN。不妥之处,请你海涵。  
  正如你上面所言,调用createRange   方法获得了一个IDispatch类型的指针。  
  这个指针可以强制转换成TextRange。不过你需要调用Release确保引用计数正确。  
  textRange用于描述HTML元素的文本。这个对象提供了一系列有用的属性和方法。比如boundingHeight、boundingLeft、boundingTop、boundingWidth、  
  htmlText、offsetLeft、offsetTop、text。不过你最关心恐怕就是htmltext和text了。  
  Top

9 楼Aizz(Nova)回复于 2002-11-07 08:55:22 得分 0

对于你想实现的方式,我觉得应该是要得到网页全部的HTML,然后对HTML过滤,取出影响选择区域的HTML。  
  可以在DreamWeaver里试试编辑网页,看看效果。  
   
  如果在IE里面查源码,会受到很多小把戏的限制,如果跳出IE呢?  
  不如试试用你自己的连接去获取页面的HTML,然后用简单的文本编辑器看吧,呵呵。  
  愚见,请指教。  
  Top

10 楼Aizz(Nova)回复于 2002-11-07 08:55:41 得分 0

对于你想实现的方式,我觉得应该是要得到网页全部的HTML,然后对HTML过滤,取出影响选择区域的HTML。  
  可以在DreamWeaver里试试编辑网页,看看效果。  
   
  如果在IE里面查源码,会受到很多小把戏的限制,如果跳出IE呢?  
  不如试试用你自己的连接去获取页面的HTML,然后用简单的文本编辑器看吧,呵呵。  
  愚见,请指教。  
  Top

11 楼Aizz(Nova)回复于 2002-11-07 08:58:25 得分 0

抱歉我发了两次,我这里速度不好多刷了几次,抱歉...Top

12 楼8bean(Junior)回复于 2002-11-07 09:34:21 得分 0

microran2000:  
              我刚按你的方法查了一下,TextRange是JavaScript里的,我不知怎么在Vc里用.  
  Top

13 楼hyonghyong()回复于 2002-11-07 09:39:02 得分 100

//模拟document.selection.createRange().text;  
  //获得选择文本;  
   
  HRESULT hr   =   S_OK;  
  BSTR                             bstr;  
  IHTMLSelectionObject*     spHTMLSelectionObject;  
  CComPtr<IDispatch>           spDisp;  
  CComPtr<IHTMLTxtRange>   spHTMLTxtRange;  
   
  hr   =   m_spIHTMLDocument2->get_selection((IHTMLSelectionObject**)(&spHTMLSelectionObject));  
  hr   =   spHTMLSelectionObject->createRange((IDispatch**)&spHTMLTxtRange);  
  hr   =   spHTMLSelectionObject->Release();  
  hr   =   spHTMLTxtRange->get_text(&bstr);  
  ::SysFreeString(bstr);  
  Top

14 楼harry202(harry)回复于 2002-11-07 10:04:29 得分 0

1   选中你需要的网页  
  2   复制到剪贴板  
  3   然后读出来  
  我觉得这个方法简单,可行,因为WORD里面进行3的时候,粘贴出来的是网页的一部分。  
  Top

15 楼hyonghyong()回复于 2002-11-07 10:12:57 得分 0

对不起我的代码写错了,将:  
  hr   =   spHTMLTxtRange->get_text(&bstr);  
  换成:  
  hr   =   spHTMLTxtRange->get_innerHTML(&bstr);  
  即可.  
   
   
   
  Top

16 楼8bean(Junior)回复于 2002-11-07 10:17:08 得分 0

hyonghyong:  
                Very   thanks.  
                我拖放链接是通过响应COleDropTarget::OnDrop事件实现的.当选中区域时得到的是其显示文本.  
                那我要实现拖放源码所要相应的事件是什么?也是COleDropTarget::OnDrop吗?  
                再次感谢!  
  Top

17 楼hyonghyong()回复于 2002-11-07 10:24:57 得分 0

实现拖放和拖放对象中的内容是两个不同的概念,实现拖放的方法不变,只是改变拖放的对象的内容即可,  
  spHTMLTxtRange->get_innerHTML(&bstr);  
  可以获得HTML的源码。  
  这个答案我也是问了很久才得来的。Top

18 楼8bean(Junior)回复于 2002-11-07 10:40:28 得分 0

harry202(harry):  
              刚开始我也是这样想的,但是如果你注意到,当你选定网页中的区域时,复制,然后粘贴,在Word和写字板里出现的结果是不一样的,所以我觉得,此时剪贴板里的数据不是html源码,是有结构的,读出是比较麻烦的.Top

19 楼8bean(Junior)回复于 2002-11-07 10:45:53 得分 0

hyonghyong:  
                  那你的意思是可以用这个了,  
                  注意到OnDrop(CWnd*   pWnd,   COleDataObject*   pDataObject,    
                                    DROPEFFECT   dropEffect,   CPoint   point   ).  
                  那我怎么在这个事件中前改变pDataObject为我想要的对象呢?  
  Top

20 楼hyonghyong()回复于 2002-11-07 10:59:17 得分 0

首先我不知道OnDrop(CWnd*   pWnd,   COleDataObject*   pDataObject,    
                                    DROPEFFECT   dropEffect,   CPoint   point   ).  
  的用法,因为我不在ATL中的用MFC,这就违背了使用ATL的原则(小巧,轻快),  
    其它可能应该是这样:只要你获得了你要数据,就可以用COleDataObject对象的方法进行其它的你要进行的工作了.  
  Top

21 楼8bean(Junior)回复于 2002-11-07 11:28:42 得分 0

ATL???不会吧.我用的是MFC,OnDrop是继承COleDropTarget::OnDrop得来的,现在剩下的问题就是如何将数据放到pDataObject里去.  
  再次表示感谢.Top

22 楼8bean(Junior)回复于 2002-11-07 11:33:02 得分 0

hyonghyong:  
                  昨天到CodeProject上提问,有人给我了一个方法,拿出来与大家共享.  
                  Use   the   DOM   to   get   a   pointer   to   the   IHTMLInputElement   which   represents   your   editbox.   Then   set   the   new   value,   and   call   reset()   on   the   embedding   Form   to   apply   the   new   value.    
   
  Top

相关问题

  • 一个让人崩溃的问题?如何得到IE中选定区域的html源码?
  • 如何用BHO取得IE的HTML源码?
  • 求一超简单的HTML源码
  • VC下如何使用CF_HTML?? 实现从IE中拖动页面内容(包括格式即源码)到一个对话框的控件中....
  • VC下如何使用CF_HTML?? 实现从IE中拖动页面内容(包括格式即源码)到一个对话框的控件中....
  • 高分求ASP计数器源码(防IE刷新的、图形的),并能教我怎么样在HTML中使用,非常感谢!!!
  • 怎样使用菜单将界面上CListCtrl 中选定项删除?源码谢谢
  • 各位,在浏览器(IE)中选定内容并拷贝到剪贴板后,如何在Delphi中获得剪贴板中的HTML代码?
  • 【Help】IE查看网页源码功能关联失败
  • 如何实现对Frame中HTML源码的直接读写

关键词

  • 源码
  • html
  • 网页
  • 选定
  • 区域
  • 文本
  • ie
  • 拖放
  • sphtmltxtrange
  • ondrop

得分解答快速导航

  • 帖主:8bean
  • hyonghyong

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo