您的位置:首页 >> 编程开发 >> Visual C++ >> COM技术 >> 正文
COM技术 RSS
 

采集网页选定部分全攻略

http://www.rdxx.com 05年07月20日 14:21 VC知识库 我要投稿

关键词: 网页 , 全攻略 , 采集 , 攻略

采集网页选定部分全攻略


作者:龙仪

下载源代码

  在 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编程,注册表操作。
  • 1,用ATL COM模板创建一个工程
  • 2,加入一个接口testa
  • 3,加入Urlmon.Lib 和 #include <urlmon.h>
  • 4,加入接口函数GetHtmlText()
  • 实现如下:

    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

    9 7 3 1 2 3 4 8 :


     
     
    标签: 网页 , 全攻略 , 采集 , 攻略 打印本文
     
     
      热点搜索
     
     
     



    Valid XHTML 1.0 Transitional
    Copyright ©2005 - 2008 Rdxx.Com,All Rights Reserved
    收藏本页
    收藏本站