如何得到IE中选定区域的html源码?
问题是这样的:
我用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源码的直接读写




