今看到一个外包项目, 要求用VB写一个电脑屏幕监控软件, 具体要求如下:

 

电脑屏幕监控软件功能实现:
1、电脑非空闲(根据鼠标键盘动作判断?)时,每五秒(通过配置文件设置)截屏并按时间命名(如201007181950.jpg)保存到指定文件夹。
2、电脑空闲一分钟(通过配置文件设备)后,自动将该文件夹内所有文件用FTP以续传的方式上传到指定FTP服务器的指定目录(目录名为本机IP地址)。

我想, AutoHotkey也能实现这些功能,杀鸡何用宰牛刀, 于是写了个Demo尝试一下,代码如下:

#Persistent

#include ../../
#include ./inc/inifile.aik
#include ./inc/capture.aik
#include ./inc/ftp.aik
g_inifile = 屏幕监控.ini		;; 配置文件
ifnotexist %g_inifile%
{
	write_ini(g_inifile, "setting", "CaptureTime", "5000") 	; 截屏间隔时间
	write_ini(g_inifile, "setting", "FTPTime", "60000")		; 上传间隔时间
	write_ini(g_inifile, "setting", "PicDir", a_scriptdir)	; 临时存放截屏图像的目录
	write_ini(g_inifile, "setting", "DelAfterFTP", "0")		; 指定将上传之后的图像删除(或移动到其他目录)
	write_ini(g_inifile, "FTP", "server", "")				; FTP服务器
	write_ini(g_inifile, "FTP", "port", "21")				; 端口
	write_ini(g_inifile, "FTP", "name", "")					; 用户名 ( 如果用户名和密码为空, 将会弹出登录窗口 )
	write_ini(g_inifile, "FTP", "password", "")				; 密码
	write_ini(g_inifile, "FTP", "remotePath", "")			; 远程目录
	msgbox 请先设置配置文件,再运行本程序!
	run %g_inifile%
	exitapp
}
; 创建保存截图的文件夹
IfNotExist, PrintScreen
{
	FileCreateDir, PrintScreen
}
   
; 创建FTP目标
IfNotExist, FTP
{
	FileCreateDir, FTP
}
; 按日期命名的FTP的子目录, 将FTPd的日志和上传完毕的图片移动到此目录
g_ftpLog = FTP/%a_yyyy%-%a_mm%-%a_dd%
IfNotExist, %g_ftpLog%
{
	FileCreateDir, %g_ftpLog%
}
   
; 从配置文件中读取配置
g_captureTime 	:= read_ini(g_inifile, "setting", "CaptureTime", "5000")
g_ftpTime 		:= read_ini(g_inifile, "setting", "FTPTime", "60000")
g_bDelAfterFTP 	:= read_ini(g_inifile, "setting", "DelAfterFTP", "0")
g_Server 		:= read_ini(g_inifile, "FTP", "server", "")
g_Port			:= read_ini(g_inifile, "FTP", "port", "21")
g_remotePath 	:= read_ini(g_inifile, "FTP", "remotePath", "")
uName 			:= read_ini(g_inifile, "FTP", "name", "")
pWord 			:= read_ini(g_inifile, "FTP", "password", "")
;; 如果密码或账号有一项为空,那么弹出对话框要求输入账号和密码
;  这里会弹出两次输入框, 在实际项目中, 最好写个登陆框, 给用户更好的体验
if ( uName == "" || pWord == "" )
{
	InputBox, uName, Please input your username, Please input your username
	if(ErrorLevel) ; 用户点击取消则退出
	{
	   ExitApp
	}
	InputBox, pWord, Please input your password, Please input your password, HIDE
	if(ErrorLevel) ; 用户点击取消则退出程序
	{
	   ExitApp
	}
}
; 其实还需要检查一下其他配置是否正确, 这个只是演示程序, 故而假设其他配置都正确.
; 设置定时器
SetTimer 【定时截屏】, %g_captureTime%
SetTimer 【定时上传FTP】, %g_ftpTime%
; 定时截屏的定时器, 每隔一段时间(鼠标/键盘空闲时), 截屏一次, 保存到PrintScreen目录
【定时截屏】:
	if ( A_TimeIdlePhysical > g_captureTime )
	{
		capfile = PrintScreen/%a_yyyy%%a_mm%%a_dd%%A_Hour%%A_Min%%A_Sec%.jpg
		CaptureScreen(0, False, capfile, 100)		; 截图函数
	}
	return
	
; 定时将截屏的图像上传到FTP服务器
【定时上传FTP】:
	if ( A_TimeIdlePhysical > g_ftpTime )
	{
		FileList =
		Loop, PrintScreen/*.jpg
		    FileList = %FileList%%A_LoopFileName%`n
		Sort, FileList  ; Sort by date.
		Loop, parse, FileList, `n
		{
		    if A_LoopField =  ; 无效的文件名则跳过
		        continue
		        
		    ; 上传一张图像
		    file_to_upload = PrintScreen/%A_LoopField%
			hConnect:=FTP_Open( g_Server, g_Port, Username, Password )
			FTP_PutFile( hConnect, file_to_upload, g_remotePath )
			FTP_CloseSocket( hConnect )
			FTP_Close( )
			
			; 删除或移动已经上传的图像文件
			if g_bDelAfterFTP = 1
		    	FileDelete %file_to_upload%
		    else 
		    	FileMove, %file_to_upload%, %g_ftpLog%/%A_LoopField% , 1
		}	
	}
	return

 

    了了几十行代码即实现了大部分功能, 定时截图、FTP上传都已经实现。定时截图测试通过, FTP上传因没有FTP账号没有测试。 当然, 这只是个Demo,  有些粗糙, FTP没有窗体,没有进度,没有续传功能,一切在无形无声中完成,要让用户有更好的体验还需要花些时间改善一下。

 

    我想需要说明几点, 抓图函数CaptureScreen() 与 FTP相关函数FTP_Open()、FTP_PutFile()、FTP_CloseSocket()、FTP_Close()都是从AutoHotkey的官方论坛上获得, 实际都是通过调用Windows API函数来实现的.

 

    希望那位外包朋友看到这篇文章, 或许可以省下外包费用, DIY 一个"电脑屏幕监控软件"出来.