用VB6写简单程序 让电骡自动关机
来源:岁月联盟
时间:2006-08-10
一、目的分析与实现原理
当所有下载任务都完成时,电骡的Temp文件夹为空(大小为0)。在VB中用FSO(FileSystemObject)来监视该文件夹大小是否为零,即可得知电骡的所有任务是否下载完。(注:使用FSO需要在工程-引用中添加“Microsoft Scripting Runtime”)
在Emule程序文件夹下面有一个“downloads.txt”文件,电骡每添加一个文件,就会在downloads.txt的结尾写上一行数据,当文件下载完成后,对应的数据行会被删去,利用这一点,我们可以对某个文件是否下载完毕进行监控,通过对这行数据中的eD2K链接进行字符操作,可以获得当前正在下载的文件信息。
VB6中借助Windows Xp的Shutdown命令,可以绕开API轻松实现关机、重启、注销等任务。同时VB6辅以Windows Xp的ntsd命令,可以实现关闭电骡。
二、界面设制
用ListBox列举正在下载任务供用户选择,两个Timer分别定时检查单个和全部任务是否完成,Enabled设置为False,Interval设置为5000或更高。Option选项卡供用户选择电骡下载完毕后执行什么操作。设计好的界面如图1
图1
三、编码
篇幅限制,这里只给出部分代码,完整的源代码及详细注解到这里下载
程序行:
Dim fso As New FileSystemObject
Private Sub Command2_Click() '点击按钮开始监视全部任务是否完成
timerall.Enabled = True '启动监视全部文件的Timer控件
End Sub
Private Sub timerall_Timer() '用Timer所有文件是否下载完进行监控
chksize = fso.GetFolder(tempdir).Size '将fso返回的电骡临时文件夹大小赋值给变量
If chksize = 0 Then '如果文件夹为空即下载完成
Call allover '执行用户选定的任务
End If
End Sub
Public Sub allover() '全部任务完成是调用的过程
Select Case overallfile
Case 1
Shell "ntsd -c q -pn emule.exe" '关闭电骡
Case 2
Call hupnow '调用API挂断,API声明在模块中,不再列出
Case 3
Shell ("shutdown -s -t 360") '调用shutdown进行关机
End Select
End Sub
Private Sub Timer_onefile_Timer() '用Timer每隔一段时间对选定的单个文件是否完成进行监控
fileoneover = True
List1.Clear '清空list框
Open "C:/Program Files/eMule/downloads.txt" For Input As #1 '打开电骡任务列表的暂存文件
Do While Not EOF(1)
Line Input #1, str '一行行读取直至到文件尾端
If Mid(str, 4, 5) = ".part" Then
List1.AddItem Left(str, InStr(str, ".part") + 4) + " 第" & Left(str, InStr(str, ".part") - 1) & "个文件"
End If
If Left(str, 8) = chktxt Then '将当前行与被选定监视的那项任务的文件名进行比对。chktxt为字符变量,存储了被监视文件的临时文件名
fileoneover = False '只要有一行匹配,该变量值为False,即该任务还没有完成
End If
Loop
Close #1
If fileoneover = True Then '只有当downloads.txt没有与被监控文件名相同的记录时,才判断该任务下载完成
Call oneover '执行用户选定的任务
End If
End Sub
单任务下载完成后调用的oneover过程与allover大同小异,不再列出。
四、提升
本程序只将形如001.part的临时文件名写入了ListBox框,而电骡eD2K link中实际包含的最终文件名并没有写入ListBox,为什么不写入最终文件名呢?这是因为当链接中有中文字符时,电骡会在Downloads.txt中用Unicode代替中文字符,用VB直接读取就会有“乱码”。有兴趣的朋友可以研究一下如何把Unicode转化为中文。
五、小结
大家可能已经发现,本文力求在实现功能的前提下让编程更加简洁直观,比如监视电骡是否下载完,很多“高手”可能会用消息监视的API函数,而本文用了简单的文件夹大小判断。再如关闭程序这个操作,以往多是用几行API来实现,这里调用了Windows Xp命令行自带的命令。我想,编程最终的目的是使用。不管是菜鸟还是高手,都不必把编程想的那么复杂,其实有的时候绕个弯,我们就能找到更简单的解决方案,希望这个想法对大家有所启示。
本程序在WindowsXp(SP2)、VB6(SP6)、eMule 0.47a VeryCD Build 0518、ADSL下调试成功。