# -*- coding: utf-8 -*- # Author : Charley # Python : 3.12.10 # Date : 2026/08/08 """防止 Windows 自动锁屏 / 息屏,保持机器处于唤醒可用状态。 原理说明: Windows 锁屏界面运行在独立的 Secure Desktop(Winlogon)上,普通用户态脚本 无法向其注入按键,因此「锁了再自动输密码解锁」在常规权限下无法实现。本脚本 改为从源头阻止自动锁屏——通过两条手段叠加保证覆盖面: 1. SetThreadExecutionState 持续声明「系统 + 显示器」处于使用中,阻止息屏与 随之而来的空闲锁屏; 2. 每隔一段时间模拟一次无副作用的按键(F15),重置系统空闲计时器,覆盖 「计算机不活动限制」这类基于空闲时长的锁屏策略。 注意:本脚本无法阻止手动 Win+L、动态锁、或域策略强制锁屏——那类锁屏一旦发生 只能人工解锁。 """ import sys import time import ctypes from ctypes import wintypes # ---- 常量:SetThreadExecutionState 标志位 ---- ES_CONTINUOUS = 0x80000000 # 持续生效,直到下次调用清除 ES_SYSTEM_REQUIRED = 0x00000001 # 阻止系统进入睡眠 ES_DISPLAY_REQUIRED = 0x00000002 # 阻止显示器关闭(连带阻止空闲锁屏) # ---- 常量:模拟按键 ---- VK_F15 = 0x7E # F15 键,绝大多数程序不响应,用作无副作用「保活」键 KEYEVENTF_KEYUP = 0x0002 # 按键抬起事件标志 # ---- 常量:轮询与保活间隔(秒)---- NUDGE_INTERVAL = 60 # 每 60 秒模拟一次按键,重置空闲计时器 def prevent_sleep_lock() -> bool: """声明系统与显示器处于使用中,阻止息屏与空闲锁屏。 Returns: bool: True 表示调用成功,False 表示 SetThreadExecutionState 返回 0(失败)。 """ # 返回值为 0 表示失败;非 0 为上一次的执行状态标志 result = ctypes.windll.kernel32.SetThreadExecutionState( ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED ) return result != 0 def allow_sleep_lock() -> None: """清除保活声明,恢复系统默认的息屏 / 锁屏行为。""" # 只传 ES_CONTINUOUS 表示撤销之前的 SYSTEM/DISPLAY 声明 ctypes.windll.kernel32.SetThreadExecutionState(ES_CONTINUOUS) def nudge_input() -> None: """模拟一次 F15 按下并抬起,重置系统空闲计时器。""" user32 = ctypes.windll.user32 # 按下再抬起,模拟一次完整敲击;F15 不影响正常输入与前台程序 user32.keybd_event(VK_F15, 0, 0, 0) user32.keybd_event(VK_F15, 0, KEYEVENTF_KEYUP, 0) def keep_awake() -> None: """主循环:持续保持机器唤醒,直到用户 Ctrl+C 退出。 循环内每 NUDGE_INTERVAL 秒重申一次保活声明并模拟一次按键, 退出时恢复系统默认锁屏行为。 """ print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] 防锁屏已启动,每 {NUDGE_INTERVAL}s 保活一次,按 Ctrl+C 退出") try: while True: ok = prevent_sleep_lock() # 重申一次,防止声明被其他程序清除 nudge_input() # 敲一下 F15,重置空闲计时器 status = "ok" if ok else "FAILED" print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] 保活心跳 -> {status}") time.sleep(NUDGE_INTERVAL) except KeyboardInterrupt: print(f"\n[{time.strftime('%Y-%m-%d %H:%M:%S')}] 收到退出信号,恢复默认锁屏行为") finally: allow_sleep_lock() # 无论如何都恢复系统默认,避免留下副作用 if __name__ == "__main__": # 仅支持 Windows;其他平台上 windll 不存在,直接提示退出 if not sys.platform.startswith("win"): print("本脚本仅适用于 Windows") sys.exit(1) keep_awake()