发布于2026-07-06 阅读(0)
扫一扫,手机访问
本文介绍使用 Python 的 pynput 库实现仅响应鼠标和键盘输入的空闲时间检测方案,避免 GetLastInputInfo() 因捕获游戏控制器等非目标设备事件而导致误判的问题。
在 Windows 平台上做用户行为监控、自动锁屏或节能策略时,一个绕不开的问题就是:怎么判断用户是不是真的“空闲”了?系统自带的 GetLastInputInfo() 用起来确实方便,可它有个“小毛病”——底层监听的是所有原始输入设备,包括游戏手柄、绘图板、VR 控制器这类 HID 设备。换句话说,哪怕用户根本没碰键盘鼠标,只是无意间晃了下手柄,空闲计时器就被重置了。这在游戏场景或专业外设环境中尤其让人头疼。
更精确的做法是主动监听,并且把设备类型限定死:只关注鼠标和键盘,其他 HID 设备一概忽略。pynput 这个 Python 库正好派上用场——它跨平台、轻量、开箱即用,底层通过操作系统原生接口(Windows 上是 Raw Input + WH_KEYBOARD_LL / WH_MOUSE_LL 钩子)捕获输入,默认只响应标准键鼠设备,天然不会受非目标外设干扰。
下面是一个完整可运行的示例代码:
from time import time
from pynput.keyboard import Listener as KeyListener
from pynput.mouse import Listener as MouseListener
idle_time = time()
txt = "You've been idle for {:.1f} seconds."
def on_activity():
global idle_time
print(txt.format(time() - idle_time))
idle_time = time()
if __name__ == '__main__':
# 启动键盘监听:任意按键触发重置
KeyListener(on_press=lambda key: on_activity()).start()
# 启动鼠标监听:移动、点击、滚动均触发重置
with MouseListener(
on_move=lambda x, y: on_activity(),
on_click=lambda x, y, button, pressed: on_activity(),
on_scroll=lambda x, y, dx, dy: on_activity()
) as mouse_listener:
mouse_listener.join() # 阻塞主线程,保持监听活跃✅ 关键优势说明:
pynput 不依赖全局输入队列,而是通过低级钩子直接过滤输入源,游戏手柄、触摸屏、语音设备都不会触发回调。on_move、on_click 等事件。比如只关心按键和点击,忽略微小的鼠标移动,让空闲判定更合理。RegisterRawInputDevices,pynput 已经封装好了权限与线程同步,开箱即用。⚠️ 注意事项:
--hidden-import=pynput,否则可能因为动态导入失败而翻车。threading.Event 来实现优雅退出。总而言之,当精度比系统调用的简洁性更重要时,pynput 给出了一条平衡开发效率与设备选择自由度的路径——它让“用户是否真的在用电脑”这个判断回归到最核心的交互设备(键盘和鼠标),而不是被外围硬件噪声干扰得七零八落。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8