儿童电脑管理软件的设计与实现
2023-06-09李进豪
李进豪
(广东生态工程职业学院信息工程学院,广州 510520)
0 引言
充分发挥新一代信息技术的优势,推进智能技术与教育教学的深度融合,推动教学模式变革和课堂体系重构,不断提升教育教学质量,助力教育实现跨越式发展,是教育教学改革的主旋律。调研表明,在教育信息化的推进过程中,对于未成年学生的电脑管理,除了正面的教育引导外,有效的远程监管是必要的。以小学生的电脑管理为例,儿童电脑管理软件一方面有利于提升学生的学习自觉性,另一方面也有利于基于过程分析提升学生的学习有效性,助力提升线上教与学的质量。
1 问题的提出
1.1 家长的忧虑
作为广东省职业教育 “双师型” 名教师工作室主持人(信息技术方向),有助推我省智能技术与教育教学深度融合的职责。在助推基础教育教学信息化的过程中,我们发现不少家长对小学生使用电脑都存在 “忧虑”,主要包括:访问不良网站、运行不良程序、学习效率偏低等。因此,基于儿童电脑管理软件减轻家长的忧虑是一项非常有意义的研究工作。
1.2 T型信息技术工匠人才的培养
作为广东省教育科学规划课题、广东省职业院校文化素质教育研究课题负责人(T 型信息技术工匠人才培养),致力于 “基于完成品的项目教学模式” 研究与实践,旨在培育 “就业有核心竞争力、创业有创新能力、升学有可持续发展能力” 的T 型工匠人才。实践证明,在课堂教学与毕业设计过程中,基于真实项目开展人才培养,更有利于培养T 型工匠人才,更有利于助力学生成为受人尊重的专业技术人才。因此,作为基础教育教学信息化推进过程中的配套附件 “儿童电脑管理软件”,课题组主持开发并引入实际教学工作中是一项非常有价值的教科研工作。
2 儿童电脑管理软件基本原理
2.1 需求分析
根据调研与分析,结合基础教育公益性管理软件的需求,以实用够用为原则,以有利于儿童成长为准绳,儿童电脑管理软件的主要功能包括:温馨提示、进程管理、实时监管等。
2.1.1 温馨提示
主要用于向儿童端发送温馨提示,该提示在指定时间内自动关闭。目的是加强家长与儿童的沟通,协助儿童进行有效学习。
2.1.2 进程管理
主要包括:启动单个进程、启动批量进程、关闭单个进程、关闭批量进程等。目的是消除不必要的学习干扰,助力儿童提升学习有效性。
2.1.3 实时监管
主要包括:儿童电脑进程监管、儿童电脑实时截图查看、儿童电脑动态截图浏览(在指定时间间隔自动截图)等。目的是基于过程分析协助儿童解决学习过程中的困难,提升学习效率与学习成就感。
2.2 基本框架
2.2.1 基于Winsock的信息收发
Winsock 是Windows 下的网络编程规范,最常用的模式是 “服务器+客户机” 模型。在这种模型中,服务器在一个IP 地址监听服务请求,当客户机对服务器提出连接请求时,则回应客户机的请求,进而建立网络通信的连接。在网络通信中,最基本的信息包括:本地IP地址+端口号、对方IP地址+端口号、通讯信息等。
2.2.2 儿童端
自动获取本机IP地址,作为 “服务器+客户机” 模型中的 “服务器”。儿童电脑开机时,儿童端自动侦听家长端(客户机)的连接请求,连接成功后,则根据家长端的指令自动完成相关的工作任务。
2.2.3 家长端
自动获取本机IP 地址和儿童端IP 地址,作为 “服务器+客户机” 模型中的 “客户机”。家长电脑开机后,家长根据需要启动与儿童电脑的 “连接”(或 “断开”)。如果选择连接,在连接成功后,家长端可以发出相应的指令(温馨提示、进程管理、实时监管等),进而实现对儿童电脑的管理(旨在提升学习有效性)。
2.2.4 开发平台
Microsoft Visual Studio 2022(WPF+C#)。
2.2.5 安全策略
儿童端在儿童电脑开机时自动执行并隐藏界面(减少干扰),等待家长端的指令。家长端根据需要选择性地与儿童端建立网络通信,但连接时需要使用登录账号和密码(账号和密码均使用加密方式保存),以确保安全性。在满足实际需求的前提下,为了减少存储空间和提高电脑的工作效率,实时监管与动态监管均采用“截图方式” 进行。其中,在保证图片具有一定清晰度的前提下,所有图片均采用压缩方式进行传输和保存。
2.3 基本原理
儿童电脑管理软件基本原理如图1所示。
图1 儿童电脑管理软件基本原理
3 儿童电脑管理软件的核心技术
3.1 自动获取本机IP地址
foreach(IPAddress MyIPAddress in Dns.GetHostEntry(Dns.GetHostName()).AddressList)
{
if(MyIPAddress.AddressFamily.ToString()==“InterNetwork”)
{
localIP = MyIPAddress.ToString();
break;
}
}
3.2 读取当前目录下的文本文件
string filePath = @“myipstart.txt”;
string mys = File.ReadAllText(filePath);
3.3 启动指定的进程
string mycommand="notepad.exe";
System.Diagnostics.Process.Start(mycommand);
3.4 获取所有的进程
Process[]myp;
myp = Process.GetProcesses();
3.5 关闭指定的进程
string mycommand =“notepad”;
Process[]myp;
myp = Process.GetProcesses();
foreach(Process p in myp)
{
if(p.ProcessName.ToUpper().Trim()== mycom⁃mand.ToUpper().Trim())p.Kill();
}
3.6 延时自动关闭的提示框
(1)调用窗体
myMessageshow = mycommand;
ShowMessage myw=new ShowMessage();
myw.Show();
(2)窗体延时自动关闭
DispatcherTimer collectTimer = new DispatcherTimer();
collectTimer.Interval = new TimeSpan(0,0,0,0,5000);
collectTimer.IsEnabled = true;
collectTimer.Tick += Timer_Tick;
private void Timer_Tick(object sender,EventArgs e)
{
this.Close();
}
3.7 实时截图
System.Drawing.Rectangle myrc = SystemInformation.VirtualScreen;
var bitmap = new Bitmap(myrc.Width,myrc.Height,System.Drawing.Imaging.PixelFormat.Format32 bppArgb);
using(Graphics memoryGrahics = Graphics.FromImage(bitmap))
{
memoryGrahics.CopyFromScreen(myrc.X,myrc.Y,0,0,myrc.Size,CopyPixelOperation.SourceCopy);
}
MemoryStream myms = null;
myms = new MemoryStream();
bitmap.Save(myms,System.Drawing.Imaging.Image Format.Png);
3.8 图片压缩
var eps = new EncoderParameters(2);
eps.Param[0]= new EncoderParameter(System.Drawing.Imaging.Encoder.Quality,5L);
eps.Param[1]= new EncoderParameter(System.Drawing.Imaging.Encoder.ColorDepth,24L);
ImageCodecInfo[]encoders = ImageCodecInfo.GetIma⁃geEncoders();
ImageCodecInfo mycodecInfo= encoders[1];
for(int j = 0;j < encoders.Length;++j)
{
if(encoders[j].MimeType==“image/jpeg”)
{
mycodecInfo = encoders[j];break;
}
}
bitmap.Save(myms,mycodecInfo,eps);
3.9 保存图片
MemoryStream fs = new MemoryStream();
int length =buff.Length;
string tstr= Encoding.Default.GetString(buff);
if(tstr.Length > 0)
{
fs.Write(buff,0,length);
fs.Flush();
Bitmap img = new Bitmap(fs);
DateTime dt = DateTime.Now;
string filePath = @“jpg”+dt.Minute.ToString()+dt.Second.ToString()+“.jpg”;
img.Save(@filePath,ImageFormat.Jpeg);
fs.Close();
}
3.10 启动侦听[1]
IPEndPoint myipe = new IPEndPoint(IPAddress.Parse(MytxtService.Text), 8081);
mytcp = new TcpListener(myipe);
mytcp.Start();
mytcp.BeginAcceptSocket(new AsyncCallback(Accept SocketCB), mytcp);
3.11 请求连接[1]
Socket mysoc = new Socket(AddressFamily.Inter⁃Network, SocketType.Stream, ProtocolType.Tcp);
mysoc.Connect(IPAddress.Parse(MytxtService.Text),8081);
mysoc.BeginReceive(buff, 0, buff.Length, SocketFlags.
None, new AsyncCallback(ReceiveCB), mysoc);
3.12 容错与错误反馈
foreach(string mycommandstr in myarr)
{
string mysc =“”;
mysc = mycommandstr +“.exe”;try
{
System.Diagnostics.Process.Start(mysc);
}
catch
{
byte[]buffstr= Encoding.Default.GetBytes(mysc +“执行失败!”);
mysoc.Send(buffstr);
}
}
4 儿童电脑管理软件的设计与实现
4.1 总体框架
4.1.1 儿童端界面
儿童端界面如图2所示。
图2 儿童端界面
4.1.2 家长端界面
家长端界面如图3所示。
图3 家长端界面
4.2 实现方案
4.2.1 儿童端
儿童电脑开机时,自动运行 “儿童端” 软件并隐藏界面。在自动获取本机IP 地址后开始侦听家长端(客户机)的连接请求。主要功能包括:
(1)接收来自家长端的温馨提示,其指令关键字为 “L100”。该 “温馨提示” 窗口,如果儿童端没有手动关闭,则在5 秒后自动关闭(可自定义,默认为5秒)。
(2)接收来自家长端的进程管理指令,完成进程的启动或关闭。启动单个进程的指令关键字为“Q100”, 启动批量进程的指令关键字为“Q200”,关闭单个进程的指令关键字为“K100”,关闭批量进程的指令关键字为 “K200”。其中,如果接受的是批量进程,那么接收的字符串是由用 “,” 作为分隔符的系列进程名称连接而成的。
(3)接收来自家长端的实时监管指令,完成进程名称的回传或实时截图的回传。其中,回传儿童电脑进程名称的指令关键字为 “G100”,回传儿童电脑实时截图的指令关键字为“T100”。
(4)接收来自家长端的关闭指令,指令关键字为 “E100”。接受该指令后,自动结束 “儿童端” 软件的运行。
4.2.2 家长端
家长电脑开机后,家长根据需要启动连接或关闭与儿童电脑的网络通信。主要功能包括:
(1)向儿童端发送温馨提示时,系统将自动在 “温馨提示” 前面添加指令关键字 “L100”。
(2)向儿童端发送进程管理指令时,如果选择的是单个进程,那么进程名称需要家长手动输入后发送,系统将自动在 “单个进程” 前面添加指令关键字 “Q100”(启动进程)或 “K100”(关闭进程);如果选择批量进程,那么存放进程名称的文本文件则需要家长提前编辑并保存,启动进程的文本文件名称为“txtmystart.txt”(指令关键字为 “Q200”),关闭进程的文本文件名称为“txtmykill.txt”(指令关键字为“K200”)。其中,文本文件中的进程名称用 “,” 进行分隔。
(3)向儿童端发送实时监管指令时,如果发送的是进程名称的回传,那么家长端发出指令“G100” 后,开始接收来自儿童电脑的进程名称。在接收儿童电脑进程名称后,软件将自动把儿童端与家长端相同的进程名称删除,只显示属于儿童端电脑专有的进程名称,以便家长更加高效地实时分析儿童电脑的软件运行情况。如果发送的是儿童电脑实时截图的回传,那么家长端发出指令 “T100” 后,开始接收来自儿童电脑的图片信息,并以 “年+月+日+时+分+秒” 作为JPG 文件的文件名进行保存(同时记录图片的保存时间)。如果发送的是儿童电脑动态截图的回传,那么家长端在发出指令 “T100”后,将同时启动计时器,每隔10 秒发出一条“T100” 的指令(可自定义,默认为10 秒),直到家长端选择停止儿童电脑动态截图的回传,其接收儿童电脑图片信息的原理与实时截图相同,并以压缩形式的系列JPG文件方式保存。
(4)向儿童端发送关闭指令时,家长端在发出指令 “E100” 后,软件将自动停止与儿童端电脑的连接。
4.3 框架代码
4.3.1 服务器侦听(儿童端)[1]
string localIP = string.Empty;
foreach(IPAddress MyIPAddress in Dns.GetHostEntry(Dns.GetHostName()).AddressList)
{
if(MyIPAddress.AddressFamily.ToString()==“InterNetwork”)
{
localIP = MyIPAddress.ToString();
break;
}
}
MytxtService.Text = localIP;
IPEndPoint myipe = new IPEndPoint(IPAddress.Parse(MytxtService.Text),8081);
mytcp = new TcpListener(myipe);
mytcp.Start();
mytcp.BeginAcceptSocket(new AsyncCallback(Accept⁃SocketCB),mytcp);
MyisClosing = false;
MyShowMsg(“开始侦听:”+ myipe.Address.ToString()+“:”+ myipe.Port.ToString());
this.Hide();
4.3.2 根据局域网IP地址段自动搜索儿童端IP地址并主动连接[2]
string filePath = @“txtmyipstart.txt”;
string mys = File.ReadAllText(filePath);//局域网的开始IP地址
int myi1=int.Parse(mys.Trim());
filePath = @“txtmyipend.txt”;
mys = File.ReadAllText(filePath);//局域网的结束IP地址
int myi2 = int.Parse(mys.Trim());
string myiptest1=localIP.Substring(0,localIP.Last⁃IndexOf(‘.’)+1);
string myiptest2 = “”;
for(int i = myi1; i <=myi2; i++)
{
myiptest2 = myiptest1 + i.ToString();
try
{
mysoc.Connect(IPAddress.Parse(myiptest2),8081);
mysoc.BeginReceive(buff,0,buff.Length,Socket⁃Flags.None,new AsyncCallback(ReceiveCB),mysoc);
MyShowMsg(“连接成功!”);
btnConnect.Content =“断开”;
this.txtService.Text = myiptest2;
break;
}
catch
{
MyShowMsg(myiptest2+“:连接失败!”);
}
}
4.3.3 指令发送(家长端)
if(this.btnSend.Content.ToString()==“停止截图”)
{
this.btnSend.Content =“发送”;
mytime.Stop();
this.mycom.Text =“温馨提示”;
return;
}
string sendData_str = txtMsg.Text.Trim();
string mycom=this.mycom.Text.Trim();
if(mycom ==“温馨提示”)
{
sendData_str =“L100”+ sendData_str;
}
if(mycom ==“启动单个进程”)
{
sendData_str =“Q100”+ sendData_str;
}
if(mycom ==“启动批量进程”)
{
string filePath = @“txtmystart.txt”;
string mys = File.ReadAllText(filePath);
sendData_str =“Q200”+ mys;
}
if(mycom ==“关闭单个进程”)
{
sendData_str=“K100”+sendData_str;
}
if(mycom ==“关闭批量进程”)
{
string filePath = @“txtmykill.txt”;
string mys = File.ReadAllText(filePath);
sendData_str =“K200”+mys;
}
if(mycom ==“儿童电脑进程”)
sendData_str =“G100”;
if(mycom ==“儿童电脑实时截图”)
sendData_str =“T100”;
if(mycom ==“儿童电脑动态截图”)
{
sendData_str =“T100”;
this.btnSend.Content =“停止截图”;
mytime.Start();
}
if(mycom ==“结束侦听”)sendData_str =“E100”;
MyShowMsg(“发送命令:”+ sendData_str);
if(sendData_str.Length >= 4)
{
if(sendData_str.Substring(0,4)==“G100”)
{
MyMsg.Items.Add(“儿童端电脑的特别进程如下:”);
}
}
byte[]sendbyte = Encoding.Default.GetBytes(send⁃Data_str);
mysoc.Send(sendbyte);
5 应用案例
5.1 管理应用
时间:2022—2023年第一学期。
班级(课程):广州市海珠区某小学四年1班(数学)。
应用截图(局部),如图4所示。
图4 管理应用
5.2 人才培养
时间:2022—2023年第一学期。
班级(课程):广东生态工程职业学院物联网2101班(C#物联网应用开发)。
应用截图(局部),如图5所示。
图5 人才培养
6 结语
WPF 提供了统一的编程模型、语言和框架,提供了丰富的.NET UI框架,集成了矢量图,适用于智慧教育环境下各种实用程序的开发。文中提及的代码全部在Microsoft Visual Studio 2022+Window 10+WPF+C#环境下调试通过,并应用实际工作中,效果较好。