· 背景和需求
因为疫情期间嘛,老爹也只能开网课,线上教棋了,但是网课又不开摄像头的那种,根本不知道学生在干嘛,这不就有了一个学生在那表面上着网课实际上是在那玩游戏,被他妈妈逮了个正着…因此我老爹就想看看能不能上网课的时候让他只能用上网课的那个程序,而正好我在看python的psutil的模块,就尝试着帮我老爹写一个看看喽
· 分析
1. 首先我需要检测正在运行进程,之后找到在封禁名单内的主进程,之后shutdown就可,这部分psutil模块就可以实现
2. 作为一个程序,我还是得写一个ui界面的,本来是想用tkinter的,不过Python这个标准GUI库功能确实不咋地,这里就现学了一下wxpython来作为程序的ui界面
3. ui界面这里主要是要提供一个最小化到托盘以及推出功能,不然的话现在的这些家长不太知道怎么退出就比较头疼了
· 代码实现
1. 主逻辑部分
· 这里我们把主逻辑部分写到一个线程里,为此我们需要线程模块,这里从threading模块
中导入Thread类
,之后定义我们自己的线程类,继承自Thread,主逻辑放到重写的run()方法
中
· 正式开始主逻辑部分,这里需要被限制程序的主进程名,为了以后好扩展,这里我们将这些主进程名放到一个列表里,之后通过转换为json格式存储到文件中,为此我写了一个config.py用来实现该功能
import json
# 存储限制进程列表到文件中去
def main():
try:
f = open('learn_tool.conf', 'w', encoding='utf-8')
limit_process_list = ['DouyuLive.exe', 'QQGame.exe', 'MicrosoftEdge.exe', '360se.exe', '360chrome.exe',
'firefox.exe', 'chrome.exe', 'QQBrowser.exe', 'SogouExplorer.exe']
json_list = json.dumps(limit_process_list)
f.write(json_list)
except LookupError:
print('指定了未知编码!')
except IOError as ex:
print(ex)
print('写文件时发生错误!')
finally:
f.close()
print('操作成功!')
if __name__ == "__main__":
main()
· 运行config.py就会生成存放限制进程名的配置文件:learn_tool.conf,之后也可以直接去这个文件中增添其他要限制的进程(ps:本来是应该在ui界面里加入这个增添限制进程功能的,有点懒,先放着吧)
· 之后在类中写一个前面的run()方法中打开该文件,将其从json格式转为list即可;关键在之后:这里直接设置死循环,因为要不断的检测是否有被限制进程,使用psutil.pids()
获取所有当前正在运行的进程id的列表,之后for循环遍历,通过psutil.Process(pid).name()
来__获取该pid对应的进程名__,之后判断进程名是否在限制进程的list中即可:不在,则继续循环;在,则调用terminate()
方法来__关闭进程__
# 自定义限制进程
class AntiInsertion(Thread):
def run(self):
# 获取要限制的进程列表
limit_process_list = self.read_conf('learn_tool.conf')
while True:
# 存放正在运行的限制进程的信息
now_run_limit_process_list = []
# 获取当前正在运行的所有进程的pid
try:
now_pids = psutil.pids() # 当前所有进程pid的list
for pid in now_pids:
if pid in psutil.pids():
_p = psutil.Process(pid) # 获取每个进程
if _p.name() in limit_process_list:
now_run_limit_process_list.append(_p)
for i in now_run_limit_process_list:
if i.pid in psutil.pids():
log.my_log(