如何仅检测鼠标/键盘空闲时间,排除其他输入设备干扰?
排除游戏控制器干扰的空闲时间检测方法
一、简便方案:仅监控键盘和鼠标输入
GetLastInputInfo()会把游戏控制器的输入误判为用户活跃,最简单的替代方式是用Windows低级钩子只跟踪键盘和鼠标的输入:
- 用
SetWindowsHookEx分别注册键盘低级钩子(WH_KEYBOARD_LL)和鼠标低级钩子(WH_MOUSE_LL) - 每次捕获到键盘或鼠标的输入事件时,更新一个全局的"最后活跃时间戳"
- 计算空闲时间时,用当前时间减去这个时间戳即可,完全不会响应游戏控制器的输入
以下是Python实现的核心示例:
import win32api import win32con import win32gui import time last_active = time.time() def on_keyboard_input(nCode, wParam, lParam): global last_active if nCode >= 0: last_active = time.time() return win32gui.CallNextHookEx(None, nCode, wParam, lParam) def on_mouse_input(nCode, wParam, lParam): global last_active if nCode >= 0: last_active = time.time() return win32gui.CallNextHookEx(None, nCode, wParam, lParam) # 挂载钩子 kb_hook = win32gui.SetWindowsHookEx(win32con.WH_KEYBOARD_LL, on_keyboard_input, win32api.GetModuleHandle(None), 0) mouse_hook = win32gui.SetWindowsHookEx(win32con.WH_MOUSE_LL, on_mouse_input, win32api.GetModuleHandle(None), 0) # 保持程序运行并检测空闲时间 try: while True: win32gui.PumpWaitingMessages() idle_sec = time.time() - last_active print(f"当前空闲时长:{idle_sec:.2f}秒") time.sleep(1) finally: win32gui.UnhookWindowsHookEx(kb_hook) win32gui.UnhookWindowsHookEx(mouse_hook)
二、Raw Input方案(精准控制)
如果需要更底层的设备过滤,可以用Raw Input机制:
- 通过
RegisterRawInputDevices仅注册键盘(RIM_TYPEKEYBOARD)和鼠标(RIM_TYPEMOUSE)类型的设备 - 在窗口的消息循环中捕获
WM_INPUT消息,解析输入设备的类型,只有当设备是键盘或鼠标时,才更新最后活跃时间戳 - 这种方式不需要额外的同步线程,直接在主线程处理消息即可,能精准排除所有非目标设备的输入
内容的提问来源于stack exchange,提问作者Zohar Levi
相关产品推荐
相关产品推荐

