You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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()

关键细节说明

  1. 非阻塞按键检测:用win32api.GetAsyncKeyState()实现,这个函数是Windows原生的,调用后立即返回按键状态,完全不会阻塞程序。它的返回值最高位为1时,说明自上次调用该函数以来,对应的按键被按下过,刚好符合我们“检测周期内是否有按键操作”的需求。
  2. CPU资源优化:每次检测后加time.sleep(0.1),避免循环太频繁占用过多CPU,0.1秒的间隔既不会影响响应速度,也能让CPU轻松处理。
  3. 鼠标移动检测:用pyautogui.position()获取当前鼠标位置,和上一次记录的位置对比,有变化就判定为用户活动。
  4. 防休眠动作:先轻微移动鼠标(左右各10像素,几乎不会干扰正常使用),然后右键点击再按ESC,这样既触发了系统的活动检测,又不会留下弹窗干扰。

备注:内容来源于stack exchange,提问作者El_que_no_duda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 08:43:09