青少年健康上网软件的设计与实现
2011-10-25田敬军
田敬军
(唐山师范学院 计算机科学系,河北 唐山 063000)
网络在给人们传递着各种各样信息的同时也带来了一些不良的元素,许多不益于青少年健康成长的内容层出不穷,这样就需要一款使得青少年能够健康上网的系统软件,把所有成人、暴力、颠覆政府等不健康或是有害的网址都屏蔽掉,如果使用者输入非法或不良的网址,将打不开网站页面;而且除非输入授权人的密码,用户无法退出这个监视系统,这样可以避免青少年未经允许自行退出程序。
1 系统功能模块
健康上网系统需要实现的功能主要有八个模块:“上网限制”、“游戏限制”、“聊天限制”、“BT 限制”、“时间限制”、“健康设置”、“记录”、“安全设置”,其中上网限制、时间限制和记录是整个系统的核心。另有“常规”、 “密码设置”、“开始监护”、“关于”以及“退出程序”等相关功能。
1.1 设置模块
(1)“上网限制”模块
限制浏览指定网站。在监控状态下就可以对限制浏览的网址进行拦截,使网页显示不能打开的状态。这一项的实现主要依赖于黑名单,即把限制浏览的网址加进黑名单里。
仅允许浏览指定网站。选择后在监控状态下只能打开指定的网站地址,而不能打开其它网址,这一项的实现主要依赖于白名单,即允许访问的网址名单。用户同样可以自行对白名单内的网址进行添加、删除和编辑等操作。
截获网址。用来记录使用者试图打开但最终没有打开的网站地址,即受限制的网址。如果选择的是“限制浏览指定网站”,若输入存在于黑名单中的网址,不但不能打开,而且会记录下该网址以及试图打开的次数和最后时间。
(2)“游戏限制”模块
在此功能模块中,对一些常见的网络游戏进行限制,如魔兽、大话西游、CS等。在进行设置时,只需要将限制玩的游戏选中,进入监控状态时会自动使选中的游戏不能进行,还可以自行添加限制玩的游戏。
(3)“聊天限制”模块
在此功能模块中,对一些常见的聊天工具进行限制,如QQ、MSN、网易泡泡等。
(4)“BT限制”模块
对于常见的下载工具进行限制使用,如比特精灵、BitComet、eMule等。
(5)“时间限制”模块
可以选择是否启动时间限制功能,在选择启动的情况下,可以添加允许上网的时间段。相应的分为每天、周一到周五和周末这三种不同的时间限制,可以分别设置每种时间限制的不同时间段,然后添加到允许上网的时间内。
(6)“健康设置”模块
可以选择是否启动视力保护功能,在选择启动的情况下,可以设置多长时间将锁住电脑几分钟。当上网时间达到一定时间间隔时,就会锁住电脑几分钟,强制性的让使用者进行视力休息,规定的时间到后会自动解锁。
(7)“记录”模块
网址记录功能。记录下使用者在上网期间访问过的所有网址,以便发现有不良信息的网址,将其加入黑名单中,这样下次就无法再访问了。
屏幕记录功能。在监控状态下,每隔2分钟电脑会自动对屏幕进行抓图,不管当时电脑屏幕上显示的是什么,都会毫无疏漏的记录下来,这样家长可以非常容易的了解到使用者所观看的内容,如果有不利于青少年身心发展的内容信息,家长都可以立刻就了解到,如果家长在其中发现了孩子的某些兴趣所在,还可以因材施教因势利导,根据孩子的兴趣爱好对其进行定向培养。
(8)安全设置
在该模块中实现的主要功能是隐藏任务栏图标,目的是为了使未成年人不易发现自己是出于监护的状态,同时防止他们自行删除退出程序。如果选择隐藏任务栏图标,则必须通过预先设定的热键来激活登录管理员窗口。
1.2 其他功能模块
(1)开始监护
选择此项后,软件会首先调用系统时间和数据库中提前设置的允许上网时间段,如果当前时间属于允许上网时间,则可以正常使用电脑,如果当前时间不在允许的时间段内,则立刻锁住电脑屏幕,在此状态下,可以切换到管理员状态,需要输入密码进行转换。
(2)“密码设置”模块
在该项功能中,提供了对密码的修改,用户可以自行修改软件的密码。只要孩子不知道密码,就无法对系统进行删除、卸载、退出等操作,以及摆脱受监控保护的状态。
2 系统中的关键技术
2.1 开机自动启动
在电脑的注册表中的根键 HKEY_LOCAL_MACHINE目录下,有一个键
"Run"(SoftwareWindowsCurrentVersionRun),
Windows开机时会自动搜索注册表,凡在该键下设置了正确路径的有效程序就会自动运行,所以本系统的开机自动启动的实现原理还是比较简单的,就是把软件的正确路径放置在注册表的该键目录下。首先在delphi的type类型声明中定义类型为TEdit的 Edit1和 Edit2,分别用来记录要添加的数值名称和数值数据(即自启动程序的路径),然后在变量定义中定义一个TRegistry类型的变量Reg,之后在代码的主体部分就可以使用变量Reg来进行创建新键等操作。主要实现代码为:
Reg:=TRegistry.Create; //创建一个新键
Reg.RootKey:=HKEY_LOCAL_MACHINE; //将根键设置为HKEY_LOCAL_MACHINE
Reg.OpenKey('SOFTWAREMicrosoftwindowsCurrentVer sionRun',true); //打开一个键
Reg.WriteString(Edit1.Text,Edit2.Text); //在 Reg这个键中写入数据名称和数据数值
Reg.CloseKey; //关闭键
2.2 隐藏进程
隐藏进程也就是按下Ctrl+Alt+Del键时使程序不出现在任务管理器中,这样就可以让使用者不易发觉程序在运行。运行程序的隐藏可以通过 API HOOK技术来实现。API HOOK技术是一种用于改变 API执行结果的技术,计算机程序可以使用这个技术来达到隐藏的目的。
2.3 上网限制
在上网限制中通过编辑黑白名单来规定可以访问或者禁止访问的网址,上网限制的界面如图1所示,可以分别设置黑名单及白名单。
图1 上网限制设置
图2 黑名单的编辑
(1)黑/白名单的编辑界面
如图 2所示,若要将某一网址加进黑/白名单,可在文本框内输入网址,如http://baidu.com,可以只输入简洁网址baidu.com,也可以全部输入,在点击“添加”之后,都会自动转化成简洁的网址形式。可以通过“编辑”和“删除”来对已有的黑/白网址进行修改或删除。
(2)黑名单的实现
首先把需要屏蔽的网址写在INI文件中,格式如下:
a1=xxxx
...
然后用 OnBeforeNavigate过程检测打开的网址是不是存在于INI文件中,不是则打开这个链接,是就不打开此链接。主体代码为:
while (i begin acd:=vValues.Values[vValues.Names[I]]; end; case AnsiContainsText(url,acd) of//检查URL是否是INI文件中的。 True: Cancel:=true; False: Cancel:=False; end; 为了提高系统的可移植性,可以同时将包括黑名单在内的相关数据写入了注册表,在注册表内的位置为 HKEY_LOCAL_MACHINE/SOFTWAER/NMUI,其中NMUI是软件的名字。 在该模块中,可以对一些常见的网络游戏进行限制使用。如图3,可以选择一个或多个想要禁止的游戏,还可以添加删除某些游戏。在监护状态下,如果启动被禁止的游戏,会显示“该程序已被禁止”字样,游戏程序也不运行。 图3 游戏限制 在程序的单元可见部分(interface)的函数声明function里,首先定义一个名为KillTask类型为boolean的函数,其参数为 ExeFileName:string,如要禁止运行某个游戏的可执行程序,文件名可为:*.exe。函数的参数取决于用户的选择,用户挑选好要禁止的程序后所有的数据都会存储在数据库的程序名单列表里,软件运行时,与数据库中数据进行逐行比较,若遇到相符的数据,则返回参数,此时可以继续进行下面的编码。 ... FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); FProcessEntry32.dwSize := SizeOf(FProcessEntry32); ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); while Integer(ContinueLoop) <> 0 do begin if ((UpperCase(ExtractFileName (FProcessEntry32.szExeFile)) = UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) = UpperCase(ExeFileName))) then Result:=Integer(TerminateProcess(OpenProcess(PROCES S_TERMINATE,BOOL(0),FProcessEntry32.th32ProcessID),0)); ContinueLoop := Process32Next(FSnapshotHandle,FProcessEntry32); ….. 可以设置每天或者周一到周五或者周末的允许上网时间段,如下图4示。 图4 时间限制 在选择“启用时间限制功能”后,如果处于监护状态下,就会对系统时间进行检查,如果当前时间不属于允许上网的时间,就会对电脑进行封锁。可以看到电脑屏幕会整个变成灰暗色,中间显示“现在不允许您使用电脑,本机已被锁定。”并且可以通过输入密码切换到管理员状态。 ... HWND hProgram=FindWindow("Progman", "Program Manager"); HWND hChild=FindWindowEx(hProgram,NULL, "SHELLDLL_DefView",NULL); ::EnableWindow(hChild,FALSE); ::EnableWindow(FindWindow("Shell_TrayWnd", NULL),false); //锁定键盘 TRegistry*reg=0; try{reg=new TRegistry(); reg->RootKey=HKEY_CURRENT_USER; AnsiStringKeyName="Software\microsoft\windows\curr entversion\policies\system"; if(reg->OpenKey(KeyName,true)) {reg->WriteString("DisableTaskMgr","0"); reg->CloseKey();} }catch(...){} if(reg){delete reg; reg=NULL;} //屏蔽任务管理器(即ctrl+alt+del) ShowWindow(FindWindow("Shell_TrayWnd",0),SW_HI DE); //隐藏开始菜单 解锁是封锁的逆过程,即先解锁键盘,再解锁任务管理器,最后显示开始菜单。 健康设置,也是读取时间,达到规定的时间时,对电脑进行封锁,封锁界面有自动倒计时功能,在规定的锁住电脑时间限达到后,可以自动解锁,继续正常使用电脑,当然,如果用户不愿意等待,可以直接输入密码进入管理状态。 在该模块中也和时间限制原理一样,即到一定时间后执行封锁电脑操作,和时间限制调用的是相同的函数。 在记录中功能中,可以记录下所有访问过的网址以及屏幕抓图记录,上网限制中的“截获网址”功能实际上也属于记录功能。屏幕记录功能可以记录下整个电脑画面,每隔两分钟自动记录一次并存放在文件夹ScreenLog中。可以在不启动软件的情况下,直接打开系统固有文件夹中的ScreenLogView可执行文件查看屏幕记录。 屏幕抓图是利用windows的API函数CapScreen来实现的,可以全屏拷贝、窗体拷贝,并支持图形存储功能。 ….. tmpBitmap.Width:= Screen.Width; tmpBitmap.Height:= Screen.Height; //捕获屏幕图像 Bitblt(tmpBitmap.Canvas.Handle,0,0,Screen.Width,Screen.Height,DeskDC,0,0,SRCCOPY); OutBitmap; finally tmpBitmap.FreeImage; tmpBitmap.Free; iBitmapValide:=False; ReleaseDC(DeskWnd,DeskDC); ….. 隐藏任务栏图标的实现。系统托盘是一个在任务栏右角的小方框,在托盘的应用程序可以显示小图标。若要隐藏程序的任务栏图标,可以应用 ShowWindow函数并传给它Application.Handle窗口句柄,即ShowWindow (Application->Handle, SW_HIDE);然后设置主窗口的Visible属性为false来隐藏它,但是后来在程序测试的时候发现通过ShowWindow来隐藏窗口的任务栏图标是不持久的,某些动作会使任务栏图标重现,后来在网上查阅和参考了很多资料,做了一些改动,就是将应用程序窗口设为Tool Window来移走程序的任务栏图标,Tool windows永远不会有任务栏图标。要实现应用程序窗口为Tool Window,可以调用API函数GetWindowLong和 SetWindowLong来完成。 ….. var dwExStyle : DWORD; begin dwExStyle:=GetWindowLong(Application.Handle, GWL_EXSTYLE); dwExStyle := dwExStyle + WS_EX_TOOLWINDOW; SetWindowLong(Application.Handle, GWL_EXSTYLE, dwExStyle); …… 阐述了实现健康上网软件的关键技术,主要利用Delphi中的系统函数,结合Windows API,对计算机系统进行控制,从而实现软件的预定目标。2.4 游戏限制
2.5 时间限制
2.6 记录
2.7 安全设置
3 结束语