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

如何仅检测鼠标/键盘空闲时间,排除其他输入设备干扰?

排除游戏控制器干扰的空闲时间检测方法

一、简便方案:仅监控键盘和鼠标输入

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 08:33:11