采集网页选定部分全攻略
作者:龙仪
下载源代码
在 VCKBASE 混了这么久竟然没有写出一篇文章,想想很是惭愧,每当在这里看到一篇好文,这种感觉尤甚,总结我在程序员加油站中的一些技术点写了这个文章(虽然程序员加油站还要继续开发,但是由于时间关系不知道什么时候能完成),如果有时间我还会写一些文章的,我的写作水平可能很差,希望读者能够包涵。
程序原理:
一、在IE菜单中加入菜单项
在注册表HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt项下建立一个新项,项的名称即为出现在菜单中的标题
将新建项的默认值设定为一个URL地址,当用户点击菜单项后,IE就会调用URL指向的页面中的脚本。
二、如何控制菜单项在合适的时候显示
下面再介绍一下上面注册项中Contexts项的作用,通过该项可以制定菜单项在右键点击IE中的什么对象时出现,它可以为以下值的“或”组合
对象
值
缺省
0x1
图片
0x2
控件
0x4
表单域
0x8
选择文本
0x10
锚点
0x20
超链接
0x22
例如上面我们希望菜单项在用户点击图片或者超链接时出现,那么我们就将值设置为
dword:00000022
既在点击图片 或者 锚点时出现菜单。一个锚点是页面中描述一个超链接的对象。如果不设置Contexts 项,则菜单项会在点击任何对象时出现在右键菜单中。
注:
一二部分我引用了《如何在IE右键菜单中添加菜单项以及如何添加IE任务栏按钮》这篇文章的部分内容,详细内容请看:
http://www.csdn.net/develop/read_article.asp?id=3621
三、编辑点击菜单项执行的script脚本
这个脚本的文件名和1中的链接文件一致这个是我用的脚本:
<script language="VBScript">Sub OnContextMenu() set nc=CreateObject("Test2.testa.1") nc.GetHtmlText()end subCall OnContextMenu()</script>//看到网海拾贝中这样用<script language="VBScript">Sub OnContextMenu() NCWEBPAGE=1 NCSELWEBPAGE=2 NCSELTEXT=3 NCALLTEXT=4 NCIMAGE=5 NCALLIMAGE=6 NCALLLINK=7 NCALLLINKTITLE=8 NCSELSOURCECODE=9 NCSOURCECODE=10 On Error Resume Next set nc=CreateObject("NcActive.NcCollect") if err<>0 then MsgBox("网海拾贝没有正确安装") else //但是这个参数至今不知道如何在控件中得到 call Nc.Gethtmldoc(NcSelText,external.menuArguments.document) end ifend subCall OnContextMenu()</script>四、在注册表中加入HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall
\\程序员加油站加入ArticlePath - 文档存盘路径(string),ArticleNumber -文档序号(dword)。
五、写一个ATL的DLL,就是上面脚本中调用的那个对象,提供一个接口GetHtmlText(),看到有些其他程序使用external.menuArguments.document做为参数,可是我没试验成功,无法直接获得其中的document所以只能用笨方法了,取得当前窗口,然后取得IE子窗口的句柄,然后取得document指针,取得选取的内容,然后保存网页,并下载图片。
下面就介绍一下ATL组件的制作,主要技术包括ATL编程,IE编程,注册表操作。
实现如下:
STDMETHODIMP Ctesta::GetHtmlText(){ //保存网页内容的目录 char chFilePath[MAX_PATH]; DWORD Number = 0; CRegistry reg; reg.Open(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\程序员加油站\\"); BOOL ret = reg.ReadDWORD("ArticleNumber",&Number); if(!ret) return S_FALSE; //读取保存网页文件的目录 ret = reg.ReadString("ArticlePath",chFilePath); if(!ret) return S_FALSE; //取得当前活动窗口的窗口句柄 HWND hWnd = GetActiveWindow(); CoInitialize( NULL ); //显式装载 MSAA 判断是否被安装 HINSTANCE hInst = ::LoadLibrary( _T("OLEACC.DLL") ); if ( hInst != NULL ) { if ( hWnd != NULL ) { HWND hWndChild=NULL; // 取得当前窗口的IE子窗口指针 ::EnumChildWindows( hWnd, EnumChildProc, (LPARAM)&hWndChild ); if ( hWndChild ) { //定义IE文档 CComPtr





