用VB6写简单程序 让电骡自动关机

  电骡(Emule)是国内最流行的P2P软件之一,他强大的功能让每位用户都能分享到互联网的优质资源。然而,主流的电骡软件中,一直没有类似于“完成任务后自动断网/关机”的选项。于是,很多朋友想尽办法让电骡下载完后自动断线、关机,却往往以失败告终。其实,我们可以写一个简单的VB程序来实现这个功能。

  一、目的分析与实现原理

  当所有下载任务都完成时,电骡的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

#p#副标题#e#
  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 ‘打开电骡任务列表的暂存文件

#p#副标题#e#
  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下调试成功。