如何在锁屏状态下保持Python pyautogui脚本持续运行
问题根源
Windows系统触发Win+L进入锁屏状态后,会将当前用户的桌面会话切换至安全锁屏界面,原桌面的GUI渲染通道、全局键鼠输入队列会被系统挂起。PyAutoGUI基于系统上层全局键鼠模拟API实现操作,锁屏后所有点击、按键、剪贴板操作都无法送达目标业务窗口,这也是你直接调用pyautogui.hotkey('win', 'l')后脚本无法继续执行的核心原因。
可行解决方案
按改造成本从低到高排序:
- 方案1:RDP自连接虚拟会话(零代码改动首选)
不需要修改你现有脚本的任何逻辑,只要在本机开启远程桌面服务,新建一个指向本机127.0.0.1的RDP远程连接,将远程会话分辨率调整为你平时写脚本用的固定值,在远程会话窗口内启动脚本后,最小化远程窗口,再按Win+L锁定本地物理屏幕即可。
注意:不要关闭远程会话窗口,仅保持最小化即可,远程会话会在后台持续保持桌面活跃状态,PyAutoGUI的所有模拟操作都会在虚拟会话内正常运行,完全不受本地锁屏影响。如果公司电脑没有禁用RDP服务,这是成本最低的方案。 - 方案2:替换锁屏为关屏不锁会话
如果公司电脑组策略没有强制自动锁屏,可以放弃系统锁屏逻辑,改为调用Windows API直接关闭显示器电源,桌面会话全程保持运行,键鼠模拟不会被中断。可以在脚本中加入关屏函数,替换原来的Win+L锁屏逻辑,在任务启动前延迟3-5秒调用即可:
注意:该状态下任何人触碰物理键鼠都会直接亮屏进入系统,适合无人能物理接触你电脑的场景,使用前请确认公司无操作自动锁屏的策略时长大于你的脚本总运行时间。import ctypes def turn_off_monitor(): # 调用系统API关闭显示器,不锁定当前会话 ctypes.windll.user32.SendMessageW(0xFFFF, 0x0112, 0xF170, 2) - 方案3:替换GUI模拟为后台操作(长期稳定方案)
PyAutoGUI的坐标点击、全局按键逻辑本身鲁棒性差,容易受窗口错位、弹窗干扰影响。如果要长期使用,建议根据操作的业务类型替换实现逻辑:操作网页类业务改用Selenium/Playwright直接操作DOM元素,操作桌面客户端改用pywinauto直接向窗口控件发送后台消息。这类实现不需要屏幕保持解锁、不需要窗口置顶,锁屏状态下也能稳定运行,不会受分辨率、窗口位置变化影响。
现有脚本调整提示
- 不要在脚本中同步调用锁屏/关屏逻辑:建议在点击「Iniciar」按钮启动任务后,加3-5秒的等待时间再触发关屏/锁屏动作,给脚本留够初始窗口切换的时间,避免锁屏触发太快打断初始操作。
- 固定操作环境参数:你的脚本中写了固定坐标点击
pyautogui.leftClick(884, 5),如果使用RDP虚拟会话方案,必须保证远程会话分辨率、窗口缩放比例和你调试脚本时的参数完全一致,避免坐标错位。 - 适当延长短等待时长:你现有脚本中多处设置了0.1s、0.15s的短等待,后台会话状态下窗口响应速度可能略慢于前台操作,建议将这类短等待调整到0.3s以上,降低操作失败概率。
内容的提问来源于stack exchange,提问作者Carlos.Correia
相关产品推荐
相关产品推荐

