作为一个开发,我的电脑经常是一个礼拜不关机,甚至时间更久,不知道在其他人看来这是不是一个常规操作。在日常工作中,我们的电脑也是一直处于非锁屏状态,出于对个人工作成果的安全性保护,我们公司给每个人的电脑上下发了一个组策略(属于强制下发,抗议无效),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++服务