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

文章来源:沧州文学网  |  2020-06-11

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

一、目的分析与实现原理

当所有下载任务都完成时,电骡的Temp文件夹为空(大小为0)。在VB中用FSO(FileSystemObject)来监视该文件夹大小是否为零,即可得知电骡的所有任务是否下载完今年晚些时候增速可能小幅加快。(注:使用FSO需要在工程-引用中添加“Microsoft Scripting Runtime”)

在Emule程序文件夹下面有一个“t”文件,电骡每添加一个文件,就会在t的结尾写上一行数据,当文件下载完成后,对应的数据行会被删去,利用这一点,我们可以对某个文件是否下载完毕进行监控,通过对这行数据中的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() '点击按钮开始监视全部任务是否完成

abled = True '启动监视全部文件的Timer控件

End Sub

Private Sub timerall_Timer() '用Timer所有文件是否下载完进行监控

chksize = tFolder(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 e" '关闭电骡

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

ear '清空list框

Open "C:\Program Files\eMule\t" For Input As #1 '打开电骡任务列表的暂存文件

Do While Not EOF(1)

Line Input #1, str '一行行读取直至到文件尾端

If Mid(str, 4, 5) = ".part" Then

dItem 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 '只有当t没有与被监控文件名相同的记录时,才判断该任务下载完成

Call oneover '执行用户选定的任务

End If

End Sub

单任务下载完成后调用的oneover过程与allover大同小异,不再列出。

四、提升

本程序只将形如rt的临时文件名写入了ListBox框,而电骡eD2K link中实际包含的最终文件名并没有写入ListBox,为什么不写入最终文件名呢?这是因为当链接中有中文字符时,电骡会在t中用Unicode代替中文字符,用VB直接读取就会有“乱码”。有兴趣的朋友可以研究一下如何把Unicode转化为中文。

五、小结

大家可能已经发现,本文力求在实现功能的前提下让编程更加简洁直观,比如监视电骡是否下载完,很多“高手”可能会用消息监视的API函数,而本文用了简单的文件夹大小判断。再如关闭程序这个操作,以往多是用几行API来实现,这里调用了Windows Xp命令行自带的命令。我想,编程最终的目的是使用。不管是菜鸟还是高手,都不必把编程想的那么复杂,其实有的时候绕个弯,我们就能找到更简单的解决方案,希望这个想法对大家有所启示。

本程序在WindowsXp(SP2)、VB6(SP6)、eMule 0.47a VeryCD Build 0518、ADSL下调试成功。

小儿感染科
临沧白癜病医院
湖南治疗白癜风方法
友情链接