求助:帮帮我吧!头要成浆糊啦!
我最近的工作遇到了如下问题:我近来需要每天在几个建材网站查找公司需要的建材信息,并把收集到的信息存到Excel表格或者FoxPro之类的数据库里,比如下面这样的表格:
========================
产品批次号 | 产品名称 |价格 |产品说明
LHJ-2007-12 | 铝合金门窗 |480 |经久耐用、
|防冻,防裂
。。。。。。
========================
我这几天,每天就是不停的按着CTRL+C和CTRL+V,把网站上提供的表格数据中,我需要的几列复制到我的表格里。
---------------------------
就是这样的工作,才做了几天,我就快疯了:
首先,并不是表格的每一列的数据都要采纳,所以不能做整个表格的复制,只能在每行里选择几项,有的连着的三四个格,还算是可怜我了,让我省点事。有的是隔一个格要复制一次,我的手都已经抽筋了;
其次,最可恨的,有的网站的表格里,就像那个“产品说明”,他偏要把内容写成两行,中间加什么软回车,搞的我把那类的单元格复制到Excel格里,总变成上、下两格,还要我手工再整理一下。
而且,看目前的工作需要,这样的复制性事情,我可能还要做很久!!!!!
----------------------------
看了我遇的难题,大家应该能想到我想做什么了
我就是想搞个程序,打开程序后,按个钮,程序最小化并启动热键接收功能,当我按一个热键,比如:CTRL+1,程序就能把我正在看的网页上的表格的所有数据,抓下来,再根据我设计好的要求,把有用的存进我的表格或数据库里;当我按另一个热键,比如:CTRL+2,程序就停止抓数据,等我再找到我需要的数据页面,我再按抓取热键。。。。。。
先跟大家透个底,我是十年前,参加过一个多月的Foxbase的培训,之后就没再接触过编程了,这几天实在是为这事头痛,找朋友借了一本Vfp 6.0 的书在啃!没办法,赶鸭子上架了!
---------------------------
我想请大家帮忙的是:
假如,我现在硬啃着vfp,勉强编个处理接收到的数据、提取有用的列存到数据库里的程序的话??????我怎么做接收数据的功能呢?也就是怎样才能在看网页的时候,按个键子,把内容保存到内存?或者转交给提取功能模块?这种功能用VFP能实现吗?还是要另编个VC或者VB的子程序?迷糊中。。。。。。
或者哪位高手,您写一个程序,哪怕是帮我解决最头痛的接收网页数据的功能的部分,您把代码发上来或发到我的邮箱,代码里您费点心,多加点注释,也好让我学习和使用!
再不然,非要让我这没啥基础的硬着头皮啃天书,我也认了,毕竟天上不可能老是掉馅饼。可既然这么长的口水贴子您都看到最后了,您就给我指个方向、给个思路,我应该使用哪些知识、运用什么手段,才能把网页的表格里的数据给提取出来!
我当然是求速成啦,有现成的最好了,手抽筋的滋味我算是尝够了,没现成的,我就求个思路,就算有九点九成我编不出这样的程序,但至少我还有一线的希望!
我的邮箱[email]tfbl2007@126.com[/email],请看完本贴的各位大侠高手们,帮帮我这门外汉吧!也希望有一天我也能算上个门里汉了,半个也好啊,哈哈!
[[italic] 本帖最后由 不懂就问呗 于 2007-12-16 12:02 编辑 [/italic]]
我查看的网页里,一般都是通篇的一个大表格,然后页面底部有第1,2,3......这样的换页链接,其它的页面,都是一样的大表格,我要获取的,就是这样的一页页的表格中的某几列,比如:
产品代号 |产品名称 |批次号 |产地 |报价 |规格说明 ........
这样的N列表格里,我就需要某中的名称,批次,报价,规格说明 等
而 产品代号 和 产地 等对我来说无用的列,就不要了
假设第一页第一行的1,3,5列要,2,4列不要,那么表格后面的行,甚至后面的十页,二十页,肯定都同样的取舍。
我自己想的思路是:
1、从网页的源代码入手:当点击打开一个页面,IE状态栏显示“完成”的时候,这个页的源代码就已经存到缓存文件夹了,我只要分析源代码页,按列取出我要的信息存入数据库,不要的列 还有表格以外的信息,就舍弃了。因为网页源代码里每个表格都会有表头,所以,从哪个td标记开始算做表格数据,应该很容易判断,又因为一页能显示的表格行数都是固定的,所以一页取多少行,也相对固定了(除最后一页行数可能不足外),这样就可以剔除与表格无关的网页布局表格标记了。
可是。。。。。。怎么才能在点击页面后,自动操作对应当前页的源代码呢? 思路2:
不自动也行,太人工智能化了,我就可能要下岗了,哈哈!
咱再想个招,从当前页的第一行开始,拽鼠标,选择所有行,CTRL+C
信息进剪贴板了吧!
可是怎么把剪贴板里的信息,弄到程序里?????Windows API???
可怕的东西,听说过,没见过! 思路3:
API就免了,那个太难,实在不行,咱来点文本文件操作的!
上面CTRL+C之后,能不能让程序自动粘到里临时的文本文件里
然后程序还能自动选择性的把每行中需要的列,转存到数据库或EXCEL表里?
。。。。。。还是很迷糊,依然存在解决不了的问题
文本文件好啊,表格里的有些数据背后藏着超链接,信息粘进文本文件,直接就过滤了,我正好不想要那些东东!
可是文本文件最大的缺点:像有的产品说明,他偏偏是中间带有软回车的,这样的信息进文本文件,本来一行的数据,就变成二行,三行了
EXCEL也是不能智能处理软回车,但它没有过滤超链接的功能,更不可取了 唉,头痛!!!!!
我现在,白天,还是笨招,先大面积复制从第一行开始到表格末尾
粘进文本文件,过滤掉背后藏着的超链接
隔一行的末尾删一下,把产品说明的软回车导致的错误换行再弄回来
再复制文本里的内容进Excel 去掉不想要的列和行(有些产品的信息不需要收录)
怎么把Excel里的数据搞进FoxPro统一管理,我正在学习中
晚上,啃FoxPro......
什么时候才能从恶梦中解脱??????????????[em05] [em11] [em10] 不知道这个代码你能不能用得着
CLEAR
lcStr=_CLIPTEXT
lcStr=CHRTRAN(CHRTRAN(CHRTRAN(lcStr,CHR(10),''),CHR(13),''),' ','')+'|'
?lcstr
FOR i=1 TO OCCURS('|',lcStr)
IF i=1
?LEFT(lcStr,AT('|',lcStr)-1)
ELSE
?SUBSTR(lcStr,AT('|',lcStr,i-1)+1,AT('|',lcStr,i)-AT('|',lcStr,i-1)-1)
ENDIF
ENDFOR 哈哈,昨天就看了版主的回复,不解~!!
因我以前学的FoxBase就没怎么学明白,勉强过了二级考试,对系统变量,根本就没见识过
昨天查了一些网上的参考书和资料,大致明白了程序段中用到的几个以前没学过的函数的含义,基本搞清楚了程序段后面部分的作用,但对如何操作剪贴板,仍不解~!!
今天正在看从网上下载的一份教学资料,第二章讲变量,就提到了系统变量的概念和
disp|list memo like这条命令
---------实验如下---------------
从别的文本文件中选取一段文字如“编程论坛bbs.bc-cn.net”,按Ctrl+C,再切换到VFP,在命令窗里
aaa=_CLIPTEXT
disp memo like aaa
-----------------------------------------------------------------------------------
就这么简单。。。。。。从别处复制的信息,就在VFP里调出来了。。。。。
就这么简单。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
就仅仅是一条将系统变量赋值给普通变量的语句。。。。。。。。。。。。。
!!!!!!!我这才明白,原来获取Windows剪贴板的内容,竟然仅仅是一个系统变量就可以搞定,我还以为要编什么API或者什么特别的程序呢!!!!
唉,不是问题太复杂,是我对使用的工具掌握的太片面,知之甚少,所以,本来简单的一件事,让我给想像和描述成大工程了。。。。。。让大家见笑了。。 我想,其实只需要把东西复制下来,然后粘贴到一个文本文件,再处理文本文件,把自己不想要的数据去掉,然后通过VFP导入到DBF中,再根据需要输出相应的EXCEL即可! 出新问题了,_CLIPTEXT只能反应出一行文本,怎么办? 我需要的是多行的表格,一起复制下来
放进VFP的DBF就行了,不用再转进Excel了,现在既然啃起编程了,就不用Excel处理了
难题就是怎么接收复制的多行文本 [em10] [em10] [em10] [em10] [em10] [em10]
不好意思,刚才看书,先看到的是TEXTBOX
刚看了EDITBOX 再试验,才知道 原来是有多行的,呵呵
现在 就是一个自动化的问题了
设想一:怎么样在网页上复制了多行表格后,按个快捷键,把信息传进VFP编的程序里?
也就是怎么给VFP编的程序定义个热键,就像QQ的CTRL+ALT+Z一样?
设想二:要是用VFP的控件编个网页浏览器,就更好了,在VFP的浏览器里,选取多行表格,再结合。。。以我现在所学,还不知道结合什么功能,等知道了再说。。。有点想的太远了,呵呵,才学一个多礼拜,就想飞了。。
VFP编的浏览器,稳定性会不会很差?先不想了,总之,日前最辣手的问题,解决指日可待!
很高兴,很兴奋,感谢CCTV,MTV,,,,,,, 通常搞不定的时候都会头痛的,理解,我也是一样!顶起 [color=Red]*测试时请打开[url]http://www.abchina.com/wwwroot/dynamic/cn/jijinjz.html[/url]页面
*其他IE页面都关闭[/color]
oShell=createobject("shell.application")
oMyshell=oShell.windows()
IF oMyshell.count>0
FOR i=1 to oMyshell.count-1
IF ("iexplore.exe" $ oMyshell.item(i).fullname)
?'标题:'+oMyshell.item(i).document.title
ENDIF
ENDFOR
ENDIF
&&item(i)指对哪个页面的操作
oObj=oMyshell.item(1).document.all.tags("table") &&表格集合
nRows=oObj.item(1).rows.length
?'行数:',nRows
nCells=oObj.item(1).rows(0).cells.length &&第一行的列数
?'列数:',nCells
?CHR(13)
FOR r = 0 TO nRows-1
FOR c = 0 TO nCells-1
??oObj.item(1).rows(r).cells(c).innerText+[ ] &&取各单元格的值
ENDFOR
?CHR(13)
ENDFOR
RELEASE oshell
RELEASE oMyshell
RELEASE oObj 没啥说的,问题解决靠大家,晚上都上我家喝酒去吧。[em12] 楼猪的问题解决没有啊?[em09] [em09] [em09] 已经做了个接收_CLIPTEXT的简单编辑文本框,你上面贴的这段代码,还没试
类的部分,暂时没太明白,我要看书,强化这部分
先收藏了,等提高点水平,再改进我的小程序
现在,已经可以在几十分钟内,就完成原来五、六个小时的工作了
腾出来的时间,就是在练习 再来看看新思路,下面的引文,是源自【编程文档助手1.2】中“网页浏览器”主题里的一篇,看到这个,我又得到了一个启发。
何不做个DLL,在浏览网页的时候,选择文本,右键点击,选自己定义的命令,直接就把数据存进对应表里了。[em12]
不对我现在是做不了,水平太低了,今天练习的时候,在表单里加个页框,运行的时候,说什么也点不了第2页,重建个表单,按原来的步骤再加个页框,就可以点第2页,找了半天的原因,也没找到。。。。。。
哪位高手,见着问题就手痒痒的,可以开发个,传上来,哈哈,也让我鸟枪换换炮。[em09] [em09]
那个软件的同一主题里,还有一篇“采集网页选定部分全攻略”(作者:龙仪),和下面的引文好像同出一辙,可是都是一个人写的。
==========引文:作者不详===========
一、如何在IE右键菜单中添加菜单项
如果使用过Netants的朋友可能都知道,NetAnts在IE中添加了右键菜单功能,只要在页面的一个链接
或者图片上点击右键后在菜单中选择 Down By Netants 就可以调用Netants下载该链接指向的文件。在本
文中作者将介绍如何通过VB来实现这样的功能。
要实现在IE右键菜单中添加菜单项的功能,要依次实现以下步骤:
1、在注册表HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt项下建立一个
新项,项的名称既出现在菜单中的标题,例如你想建立的菜单项标题为Add URL,则新建项的名称为
HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\Add URL
2、将新建项的默认值设定为一个URL地址,当用户点击菜单项后,IE就会调用URL指向的页面中的脚
本,在目标页面的脚本中通过访问IE提供的external对象的menuArguments属性就可以访问IE中的页面中的
各种对象,例如链接、图片、表单域、被选中的文本等。详细的帮助请参考MSDN中关于InternetExplore object
的帮助,熟悉了Window对象才可以比较好的了解下面的脚本。
对于如何实现自身的程序访问menuArguments的问题,我们可以仿效Netants的做法,首先建立一个
OLE Automation对象,然后在脚本中调用该对象,并将页面信息传递对象处理。下面我们需要首先通过VB建立
一个对象:
打开VB,点击菜单: File | New ,在新建工程窗口中选择 ActiveX Dll 后按确定键建立一个ActiveX DLL
工程。然后在工程列表窗口中将Class1的Name属性更改为NetAPI,然后在NetAPI的代码窗口中添加如下代码:
Public Sub AddURL(URL As String, Info As String)
MsgBox Info, vbOKOnly, URL
End Sub
保存文件,将工程文件保存成NetSamp.vbp。然后在菜单中选择 File | Make NetSamp.dll建立对象动态
连接库。
接下来是注册库,在Windows目录下找到Regsvr32.exe,然后将其拷贝到netsamp.dll所在目录下,将
netsamp.dll的的图标拖到Regsvr32.exe上放开,这时Regsvr32.exe就会弹出对话框提示对象注册成功。
打开UltraEdit(或者其它文本编辑器)将下面的脚本代码输入编辑器中:
<script language="VBScript">
Sub OnContextMenu()
On Error Resume Next
set srcEvent = external.menuArguments.event
set EventElement = external.menuArguments.document.elementFromPoint(srcEvent.clientX, srcEvent.clientY)
set objNetSamp=CreateObject("NetSamp.NetAPI")
if srcEvent.type = "MenuExtAnchor" then
set srcAnchor = EventElement
do until TypeName(srcAnchor)="HTMLAnchorElement"
set srcAnchor=srcAnchor.parentElement
Loop
Call objNetSamp.AddUrl(srcAnchor.href,srcAnchor.innerText)
elseif srcEvent.type="MenuExtImage" then
if TypeName(EventElement)="HTMLAreaElement" then
Call objNetSamp.AddUrl(EventElement.href,EventElement.Alt)
else
set srcImage = EventElement
set srcAnchor = srcImage.parentElement
do until TypeName(srcAnchor)="HTMLAnchorElement"
set srcAnchor=srcAnchor.parentElement
if TypeName(srcAnchor)="Nothing" then
call objNetSamp.AddUrl(srcImage.href,srcImage.Alt)
exit sub
end if
Loop
Call objNetSamp.AddUrl(srcAnchor.href, srcImage.Alt)
end if
elseif srcEvent.type="MenuExtUnknown" then
set srcAnchor = EventElement
do until TypeName(srcAnchor)="HTMLAnchorElement"
set srcAnchor=srcAnchor.parentElement
if TypeName(srcAnchor)="Nothing" then
Call objNetSamp.AddUrl(EventElement.href,EventElement.innerText)
exit sub
end if
Loop
Call objNetSamp.AddUrl(srcAnchor.href,srcAnchor.innerText)
end if
end Sub
call OnContextMenu()
</script>
将文件保存到c:\program files 下,文件名为 geturl.htm
从上面的脚本可以看到,首先访问external.menuArguments属性,获得用户单击鼠标右键位置的对象,然
后根据对象的不同获得它的URL,然后建立IEContextMenu.IEMenu1对象并调用该对象的AddURL方法。
接下来是为右键菜单建立注册项,打开UltraEdit(或者其它文本编辑器)将下面的注册数据输入编辑器中
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\&Get URL]
@="c:\\program files\\geturl.htm"
"Contexts"=dword:00000022
将文件以reg为后缀保存,然后在Windows资源管理器中双击该文件将注册项添加到注册表中,然后打开
IE,右键点击一个连接或者图片,在弹出菜单中会出现一个Get URL项,点击该项,就会出现一个消息框显示
点击的连接或者图片的URL地址
下面再介绍一下上面注册项中Contexts项的作用,通过该项可以制定菜单项在右键点击IE中的什么对象时
出现,它可以为以下值的“或”组合:
对象 值
缺省 0x1
图片 0x2
控件 0x4
表单域 0x8
选择文本 0x10
锚点 0x20
例如上面我们希望菜单项在用户点击图片或者超链接时出现,那么我们就将值设置为dword:00000022,既在
点击图片 或者 锚点时出现菜单。一个锚点是页面中描述一个超链接的对象。如果不设置Contexts项,则菜单项
会在点击任何对象时出现在右键菜单中。
通过上面的程序介绍我们可以看到IE鼠标右键菜单的工作过程。前面讲了,Netants就是使用这样的方法通过
在脚本中建立对象来实现调用NetAnts的,那么我们如果安装了NetAnts,就可以在程序中通过调用NetAnts对象来
调用NetAnts。
建立一个新工程,点击菜单 Projects | References 项,选择其中的 AntAPI 1.0 Type Library 项,如果没有
点击Browser按钮,在文件列表框中选择网络蚂蚁目录下的NetAPI.dll后按打开键。在Form1中添加一个CommandButton
按钮,在Command1_Click事件中添加如下代码:
Dim ant As New ANTAPILib.AntAPIObj
ant.AddUrl "http://www.applevb.com/z.zip", "", "http://www.applevb.com/"
点击command1,然后NetAnts就会运行并且将[url]http://www.applevb.com/z.zip[/url]添加到任务中。
二、如何添加任务栏按钮
基本上来说,添加任务栏按钮只需要修改注册表就可以实现。通过修改注册表来实现添加按钮的步骤如下:
1、建立一个GUID。
2、打开注册表编辑器,转到HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Extensions部分,
在其下添加一个新的项,名称为 <Your GUID> ,Your GUID为你刚建立的GUID。
3、在注册表的 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Extensions\<Your GUID>
下建立一个新的String类型的值,名称为HotIcon,该值定义当按钮具有热点时的图标,它的一般类型为:
包含图标的文件全路径名,图标索引,例如:
C:\PROGRA~1\KINGSOFT\XDICT\ieplugin.DLL,208
4、在注册表的 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Extensions\<Your GUID>
下建立一个新的String类型的值,名称为Icon,该值定义当按钮的图标,它的一般类型为:
图标文件全路径名,图标索引
5、在注册表的 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Extensions\<Your GUID>
下建立一个新的String类型的值,名称为ButtonText,该值定义按钮的ToolTip文本。
6、在注册表的 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Extensions\<Your GUID>
下建立一个新的String类型的值,名称为Default Visible,该值定义按钮是否可见,如果是,则该值设定
为"Yes",否则设定为"No"。
7、在注册表的 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Extensions\<Your GUID>
下建立一个新的String类型的值,名称为Clsid,将该值设定为{1FBA04EE-3024-11D2-8F1F-0000F87ABD16}
8、在注册表的 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Extensions\<Your GUID>
下建立一个新的String类型的值,名称为Exec,该值定义点击按钮后运行的文件的全路径名称,例如:
c:\program files\samples\net.exe
例如NetAnts的按钮注册表项的内容就是象下面这样:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Extensions\{57E91B47-F40A-11D1-B792-444553540000}]
"CLSID"="{1FBA04EE-3024-11D2-8F1F-0000F87ABD16}"
"Default Visible"="Yes"
"HotIcon"="C:\\PROGRA~1\\NETANTS\\NetAnts.exe,1001"
"Icon"="C:\\PROGRA~1\\NETANTS\\NetAnts.exe,1000"
"Exec"="C:\\PROGRA~1\\NETANTS\\NetAnts.exe"
"ButtonText"="NetAnts"
"MenuText"="&NetAnts"
"MenuStatusBar"="Launch NetAnts"
当点击NetAnts按钮时就会运行Netants。上面的注册表项中下面的两项:MenuText项添加一个菜单项到菜单
的“工具”栏中,MenuStatusBar项定义当光标移动到添加的菜单栏上后显示在状态栏中提示文本。此外在注册表的
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Extensions\<Your GUID>下还可以添加一个名称为
MenuCustomize的字符串类型值,将该值设定为"Help"将使菜单项出现在“帮助”菜单栏中,否则出现在“工具”栏中。
当然,我们不会满足于只是添加一个按钮,执行一个程序,我们希望能够获得当用户点击按钮时能够操控当前
页面,在注册表的 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Extensions\<Your GUID>
下建立一个新的String类型的值,名称设定为一个htm文件的全路径名,同前面介绍的添加鼠标右键菜单一样,在点击
按钮后IE会调用该文件,在文件中通过设定VBScript访问external对象的menuArguments属性就可以获得浏览器中的
页面。例如我们将HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Extensions\<Your GUID>\VBScript
的值设定为c:\program files\samp.htm,然后在c:\program files下建立一个名为Samp.htm的文件,在文件中输入以下
脚本内容:
<script language="VBScript">
Set objNetSamp=CreateObject("IEContextMenu.IEMenu1")
userURL=external.menuArguments.location.href
Call objNetSamp.AddUrl(userURL,"")
</script>
打开IE浏览%E 再来看看新思路,下面的引文,是源自【编程文档助手1.2】中“网页浏览器”主题里的一篇,看到这个,我又得到了一个启发。
何不做个DLL,在浏览网页的时候,选择文本,右键点击,选自己定义的命令,直接就把数据存进对应表里了。[em12]
不对我现在是做不了,水平太低了,今天练习的时候,在表单里加个页框,运行的时候,说什么也点不了第2页,重建个表单,按原来的步骤再加个页框,就可以点第2页,找了半天的原因,也没找到。。。。。。
哪位高手,见着问题就手痒痒的,可以开发个能公用的、附源码的,传上来,哈哈,也让我鸟枪换换炮。[em09] [em09]
那个软件的同一主题里,还有一篇“采集网页选定部分全攻略”(作者:龙仪),和下面的引文好像同出一辙,可是都是一个人写的。
==========引文:作者不详===========
一、如何在IE右键菜单中添加菜单项
如果使用过Netants的朋友可能都知道,NetAnts在IE中添加了右键菜单功能,只要在页面的一个链接
或者图片上点击右键后在菜单中选择 Down By Netants 就可以调用Netants下载该链接指向的文件。在本
文中作者将介绍如何通过VB来实现这样的功能。
要实现在IE右键菜单中添加菜单项的功能,要依次实现以下步骤:
1、在注册表HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt项下建立一个
新项,项的名称既出现在菜单中的标题,例如你想建立的菜单项标题为Add URL,则新建项的名称为
HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\Add URL
2、将新建项的默认值设定为一个URL地址,当用户点击菜单项后,IE就会调用URL指向的页面中的脚
本,在目标页面的脚本中通过访问IE提供的external对象的menuArguments属性就可以访问IE中的页面中的
各种对象,例如链接、图片、表单域、被选中的文本等。详细的帮助请参考MSDN中关于InternetExplore object
的帮助,熟悉了Window对象才可以比较好的了解下面的脚本。
对于如何实现自身的程序访问menuArguments的问题,我们可以仿效Netants的做法,首先建立一个
OLE Automation对象,然后在脚本中调用该对象,并将页面信息传递对象处理。下面我们需要首先通过VB建立
一个对象:
打开VB,点击菜单: File | New ,在新建工程窗口中选择 ActiveX Dll 后按确定键建立一个ActiveX DLL
工程。然后在工程列表窗口中将Class1的Name属性更改为NetAPI,然后在NetAPI的代码窗口中添加如下代码:
Public Sub AddURL(URL As String, Info As String)
MsgBox Info, vbOKOnly, URL
End Sub
保存文件,将工程文件保存成NetSamp.vbp。然后在菜单中选择 File | Make NetSamp.dll建立对象动态
连接库。
接下来是注册库,在Windows目录下找到Regsvr32.exe,然后将其拷贝到netsamp.dll所在目录下,将
netsamp.dll的的图标拖到Regsvr32.exe上放开,这时Regsvr32.exe就会弹出对话框提示对象注册成功。
打开UltraEdit(或者其它文本编辑器)将下面的脚本代码输入编辑器中:
<script language="VBScript">
Sub OnContextMenu()
On Error Resume Next
set srcEvent = external.menuArguments.event
set EventElement = external.menuArguments.document.elementFromPoint(srcEvent.clientX, srcEvent.clientY)
set objNetSamp=CreateObject("NetSamp.NetAPI")
if srcEvent.type = "MenuExtAnchor" then
set srcAnchor = EventElement
do until TypeName(srcAnchor)="HTMLAnchorElement"
set srcAnchor=srcAnchor.parentElement
Loop
Call objNetSamp.AddUrl(srcAnchor.href,srcAnchor.innerText)
elseif srcEvent.type="MenuExtImage" then
if TypeName(EventElement)="HTMLAreaElement" then
Call objNetSamp.AddUrl(EventElement.href,EventElement.Alt)
else
set srcImage = EventElement
set srcAnchor = srcImage.parentElement
do until TypeName(srcAnchor)="HTMLAnchorElement"
set srcAnchor=srcAnchor.parentElement
if TypeName(srcAnchor)="Nothing" then
call objNetSamp.AddUrl(srcImage.href,srcImage.Alt)
exit sub
end if
Loop
Call objNetSamp.AddUrl(srcAnchor.href, srcImage.Alt)
end if
elseif srcEvent.type="MenuExtUnknown" then
set srcAnchor = EventElement
do until TypeName(srcAnchor)="HTMLAnchorElement"
set srcAnchor=srcAnchor.parentElement
if TypeName(srcAnchor)="Nothing" then
Call objNetSamp.AddUrl(EventElement.href,EventElement.innerText)
exit sub
end if
Loop
Call objNetSamp.AddUrl(srcAnchor.href,srcAnchor.innerText)
end if
end Sub
call OnContextMenu()
</script>
将文件保存到c:\program files 下,文件名为 geturl.htm
从上面的脚本可以看到,首先访问external.menuArguments属性,获得用户单击鼠标右键位置的对象,然
后根据对象的不同获得它的URL,然后建立IEContextMenu.IEMenu1对象并调用该对象的AddURL方法。
接下来是为右键菜单建立注册项,打开UltraEdit(或者其它文本编辑器)将下面的注册数据输入编辑器中
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\&Get URL]
@="c:\\program files\\geturl.htm"
"Contexts"=dword:00000022
将文件以reg为后缀保存,然后在Windows资源管理器中双击该文件将注册项添加到注册表中,然后打开
IE,右键点击一个连接或者图片,在弹出菜单中会出现一个Get URL项,点击该项,就会出现一个消息框显示
点击的连接或者图片的URL地址
下面再介绍一下上面注册项中Contexts项的作用,通过该项可以制定菜单项在右键点击IE中的什么对象时
出现,它可以为以下值的“或”组合:
对象 值
缺省 0x1
图片 0x2
控件 0x4
表单域 0x8
选择文本 0x10
锚点 0x20
例如上面我们希望菜单项在用户点击图片或者超链接时出现,那么我们就将值设置为dword:00000022,既在
点击图片 或者 锚点时出现菜单。一个锚点是页面中描述一个超链接的对象。如果不设置Contexts项,则菜单项
会在点击任何对象时出现在右键菜单中。
通过上面的程序介绍我们可以看到IE鼠标右键菜单的工作过程。前面讲了,Netants就是使用这样的方法通过
在脚本中建立对象来实现调用NetAnts的,那么我们如果安装了NetAnts,就可以在程序中通过调用NetAnts对象来
调用NetAnts。
建立一个新工程,点击菜单 Projects | References 项,选择其中的 AntAPI 1.0 Type Library 项,如果没有
点击Browser按钮,在文件列表框中选择网络蚂蚁目录下的NetAPI.dll后按打开键。在Form1中添加一个CommandButton
按钮,在Command1_Click事件中添加如下代码:
Dim ant As New ANTAPILib.AntAPIObj
ant.AddUrl "http://www.applevb.com/z.zip", "", "http://www.applevb.com/"
点击command1,然后NetAnts就会运行并且将[url]http://www.applevb.com/z.zip[/url]添加到任务中。
二、如何添加任务栏按钮
基本上来说,添加任务栏按钮只需要修改注册表就可以实现。通过修改注册表来实现添加按钮的步骤如下:
1、建立一个GUID。
2、打开注册表编辑器,转到HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Extensions部分,
在其下添加一个新的项,名称为 <Your GUID> ,Your GUID为你刚建立的GUID。
3、在注册表的 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Extensions\<Your GUID>
下建立一个新的String类型的值,名称为HotIcon,该值定义当按钮具有热点时的图标,它的一般类型为:
包含图标的文件全路径名,图标索引,例如:
C:\PROGRA~1\KINGSOFT\XDICT\ieplugin.DLL,208
4、在注册表的 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Extensions\<Your GUID>
下建立一个新的String类型的值,名称为Icon,该值定义当按钮的图标,它的一般类型为:
图标文件全路径名,图标索引
5、在注册表的 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Extensions\<Your GUID>
下建立一个新的String类型的值,名称为ButtonText,该值定义按钮的ToolTip文本。
6、在注册表的 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Extensions\<Your GUID>
下建立一个新的String类型的值,名称为Default Visible,该值定义按钮是否可见,如果是,则该值设定
为"Yes",否则设定为"No"。
7、在注册表的 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Extensions\<Your GUID>
下建立一个新的String类型的值,名称为Clsid,将该值设定为{1FBA04EE-3024-11D2-8F1F-0000F87ABD16}
8、在注册表的 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Extensions\<Your GUID>
下建立一个新的String类型的值,名称为Exec,该值定义点击按钮后运行的文件的全路径名称,例如:
c:\program files\samples\net.exe
例如NetAnts的按钮注册表项的内容就是象下面这样:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Extensions\{57E91B47-F40A-11D1-B792-444553540000}]
"CLSID"="{1FBA04EE-3024-11D2-8F1F-0000F87ABD16}"
"Default Visible"="Yes"
"HotIcon"="C:\\PROGRA~1\\NETANTS\\NetAnts.exe,1001"
"Icon"="C:\\PROGRA~1\\NETANTS\\NetAnts.exe,1000"
"Exec"="C:\\PROGRA~1\\NETANTS\\NetAnts.exe"
"ButtonText"="NetAnts"
"MenuText"="&NetAnts"
"MenuStatusBar"="Launch NetAnts"
当点击NetAnts按钮时就会运行Netants。上面的注册表项中下面的两项:MenuText项添加一个菜单项到菜单
的“工具”栏中,MenuStatusBar项定义当光标移动到添加的菜单栏上后显示在状态栏中提示文本。此外在注册表的
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Extensions\<Your GUID>下还可以添加一个名称为
MenuCustomize的字符串类型值,将该值设定为"Help"将使菜单项出现在“帮助”菜单栏中,否则出现在“工具”栏中。
当然,我们不会满足于只是添加一个按钮,执行一个程序,我们希望能够获得当用户点击按钮时能够操控当前
页面,在注册表的 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Extensions\<Your GUID>
下建立一个新的String类型的值,名称设定为一个htm文件的全路径名,同前面介绍的添加鼠标右键菜单一样,在点击
按钮后IE会调用该文件,在文件中通过设定VBScript访问external对象的menuArguments属性就可以获得浏览器中的
页面。例如我们将HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Extensions\<Your GUID>\VBScript
的值设定为c:\program files\samp.htm,然后在c:\program files下建立一个名为Samp.htm的文件,在文件中输入以下
脚本内容:
<script language="VBScript">
Set objNetSamp=CreateObject("IEContextMenu.IEMenu1")
userURL=external.menuArguments.location.href
Call objNetSamp.AddUrl(userURL,"")
</script>
打开IE浏览器,点击
页:
[1]
2
