如何在Windows环境下用Python实现非阻塞式的任意按键检测
如何在Windows环境下用Python实现非阻塞式的任意按键检测
嘿,我完全get到你的需求了——原来的防休眠脚本只检测鼠标移动,现在想扩展成同时检测任意按键操作,还不能让程序一直阻塞等着按键,对吧?刚好在Windows环境下有个非常合适的方案,结合Windows原生API和Python库就能完美解决这个问题,下面给你详细说:
核心思路
我们需要实现一个非阻塞的双检测逻辑:在60秒的检查周期内,每隔一小段时间就同时检查两个条件:
- 鼠标位置是否发生变化
- 有没有任何按键被按下过
只要其中一个条件满足,就判定用户有活动,跳过防休眠操作;如果60秒内都没检测到活动,就执行你的防休眠动作(移动鼠标、右键、按ESC)。
具体实现代码
首先你需要安装两个依赖库:pywin32(用来调用Windows API)和pyautogui(处理鼠标操作和位置检测),用pip安装就行:
pip install pywin32 pyautogui
然后是完整的脚本代码:
import win32api import pyautogui import time def has_any_key_pressed(): """检查是否有任意按键被按下(非阻塞)""" # 遍历所有常见的虚拟键码范围(0-255覆盖绝大多数常用按键) for key_code in range(256): # GetAsyncKeyState返回值的最高位为1,表示自上次调用以来按键被按下过 if win32api.GetAsyncKeyState(key_code) & 0x8000: return True return False def main(): check_interval = 60 # 检查间隔,单位:秒 last_mouse_pos = pyautogui.position() # 记录初始鼠标位置 print("防休眠脚本已启动,按Ctrl+C终止...") try: while True: start_time = time.time() user_activity_detected = False # 在检查周期内循环检测用户活动 while time.time() - start_time < check_interval: # 检查鼠标是否移动 current_mouse_pos = pyautogui.position() if current_mouse_pos != last_mouse_pos: user_activity_detected = True last_mouse_pos = current_mouse_pos # 更新鼠标位置 break # 检查是否有按键按下 if has_any_key_pressed(): user_activity_detected = True break # 每次检测间隔0.1秒,避免占用过多CPU资源 time.sleep(0.1) if not user_activity_detected: # 执行防休眠操作 print("未检测到用户活动,执行防休眠动作...") # 轻微移动鼠标(避免肉眼可见的干扰) pyautogui.moveRel(10, 0) pyautogui.moveRel(-10, 0) # 右键点击+ESC取消菜单 pyautogui.rightClick() time.sleep(0.1) pyautogui.press('esc') # 操作后短暂等待 time.sleep(1) # 重置鼠标位置,准备下一轮检查 last_mouse_pos = pyautogui.position() except KeyboardInterrupt: print("\n脚本已终止") if __name__ == "__main__": main()
关键细节说明
- 非阻塞按键检测:用
win32api.GetAsyncKeyState()实现,这个函数是Windows原生的,调用后立即返回按键状态,完全不会阻塞程序。它的返回值最高位为1时,说明自上次调用该函数以来,对应的按键被按下过,刚好符合我们“检测周期内是否有按键操作”的需求。 - CPU资源优化:每次检测后加
time.sleep(0.1),避免循环太频繁占用过多CPU,0.1秒的间隔既不会影响响应速度,也能让CPU轻松处理。 - 鼠标移动检测:用
pyautogui.position()获取当前鼠标位置,和上一次记录的位置对比,有变化就判定为用户活动。 - 防休眠动作:先轻微移动鼠标(左右各10像素,几乎不会干扰正常使用),然后右键点击再按ESC,这样既触发了系统的活动检测,又不会留下弹窗干扰。
备注:内容来源于stack exchange,提问作者El_que_no_duda
相关产品推荐
相关产品推荐

