防止系统锁屏-python、C++实现

作为一个开发,我的电脑经常是一个礼拜不关机,甚至时间更久,不知道在其他人看来这是不是一个常规操作。在日常工作中,我们的电脑也是一直处于非锁屏状态,出于对个人工作成果的安全性保护,我们公司给每个人的电脑上下发了一个组策略(属于强制下发,抗议无效),5min不对电脑进行操作,电脑就锁屏,这可真是令人操蛋,出去上个厕所的功夫电脑就锁屏啦、和别人讨论问题的功夫电脑又锁屏了,作为一个开发,这真不能忍。

最近一直在学习python,刚好接触到了python写windows服务相关的一些东西,嘿嘿,5分钟不操作电脑锁屏是吧,那么我们在无任何操作下2分钟给他模拟一次键盘或者鼠标操作可好。

二、模拟鼠标、键盘事件

要写一个windows服务也是比较简单的,只需要继承自win32serviceutil.ServiceFramework这个类,然后实现相关方法即可,主要的方法是SvcDoRun,服务启动后,该方法处于激活状态,该方法结束服务退出

具体的实现方式可参考Python-定时爬取指定城市天气(二)-邮件提醒文章中的第三小节,优化定时任务。

1、python实现

这里我只贴出关键代码,服务的整体框架不在细说,不会的同学请看这里Python-定时爬取指定城市天气(二)-邮件提醒

a、python服务

首先判断鼠标2分钟内是否有操作,我们需要能获取到当前鼠标位置的函数,pyautogui是一个python的自动化库,满足我们的需求,该库提供了丰富的鼠标、键盘操作,使用该库,首先就得使用pip进行安装

pip install pyautogui

使用方式如下,x和y即是当前鼠标相对于屏幕左上角(0,0)的坐标

import pyautogui as pag x, y = pag.position() #返回鼠标的坐标

模拟鼠标、键盘操作,无非是鼠标点击、移动、键盘按下等,这些pyautogui都已经提供,看名字就知道什么意思,这里我们先进行了鼠标点击,默认是左键,然后移动了鼠标位置,并且在最后按下了键盘上的esc键

pag.click() pag.moveTo(x + 10, y + 10, 0.1) pag.moveTo(x, y, 0.1) writeLog(\'模拟一次鼠标移动\n\')# pag.press(\'esc\') writeLog(\'模拟点击esc\n\')#

完整的SvcDoRUn函数如下

def SvcDoRun(self): #what to do# prev_time = datetime.datetime.now() oldx = 0 oldy = 0 while self.run: x, y = pag.position() #返回鼠标的坐标 now_time = datetime.datetime.now() if x == oldx and y == oldy: stay_seconds = (now_time - prev_time).seconds if stay_seconds >= 60: prev_time = now_time pag.click() pag.moveTo(x + 10, y + 10, 0.1) pag.moveTo(x, y, 0.1) writeLog(\'模拟一次鼠标移动\n\')# pag.press(\'esc\') writeLog(\'模拟点击esc\n\')# else: #更新旧坐标 最后一次移动鼠标时间 oldx = x oldy = y prev_time = now_time #os.system(\'cls\')#清楚屏幕 stay_seconds = (now_time - prev_time).seconds writeLog(\'鼠标{}秒未移动\n\'.format(stay_seconds))#打印坐标 posStr = "Position:" + str(x).rjust(4) + \',\' + str(y).rjust(4) writeLog(posStr + \'\n\')#打印坐标 time.sleep(2)

服务函数写完了,接下来是打包服务的过程,并启动服务

1. 打包服务成一个exe,pyinstaller -F aaa.py 2. 安装服务 python aaa.exe install 3. 启动服务 python aaa.exe start 4. 停止服务 python aaa.exe stop 5. 移除服务 python aaa.exe remove

执行上述流程的1、2和3,服务就已经被成功启动,但不幸的是发现pag.position()返回的坐标一直是0,各种测试都不对,开始怀疑是服务里可能找不到pyautogui资源导致失败,后来在网上找了另一种或许鼠标位置的函数

def get_mouse_point(): po = POINT() windll.user32.GetCursorPos(byref(po)) return int(po.x), int(po.y)

经过测试,该函数单独运行时没有问题,放在服务里拿到的坐标还是(0, 0),写服务的路子算是泡汤啦

为了更好的查找服务的运行状态,我们这里把服务的运行时状态卸载了一个文件里,写日志代码如下

#写日志 def writeLog(msg): try: f = open(\'./prevent_lock_screen.log\', \'a\', encoding = \'utf-8\') f.write(datetime.datetime.now().strftime(\'%Y-%m-%d %H:%M:%S\') + \':\' + msg) f.close() except BaseException: pass b、python函数

python服务的方式暂时算是中断了,但是我们还是不能放弃啊,经过尝试,把运行在服务里的代码拿出来放在正常python文件里执行还是好使的。不明所以啊,++哪位大神如果知道服务里的代码为什么运行失败,还请评论区支出,不胜感激。。。++

为了防止电脑自动锁屏,要一直运行一个dos窗口看起来确实挺扯的,初学python可能好多东西还是不懂,因此为了让这个需求更优雅一些,我拿起了C++,我们还是先来写一个服务吧

2、C++实现

为了实现这个需求,我也真是拼了

a、C++服务

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwfgss.html