如何检测仅限鼠标/键盘的空闲时间,而不考虑其他输入设备?

1 投票
2 回答
53 浏览
提问于 2025-04-12 19:30

GetLastInputInfo() 这个函数可以用来检测用户的空闲时间,比如在 用Python检测空闲时间 的时候,它会对鼠标和键盘的输入很敏感。不过,它也会受到游戏手柄输入的影响,而我希望忽略这些输入。

有没有简单的方法可以做到这一点呢?

一种方法是使用原始输入(Raw Input),比如在 使用winapi读取设备输入时遇到问题 中提到的。这种方法需要用到同步的写和读线程,这样可以记录输入事件,并且可以随时查询这些记录。

2 个回答

0

你可以做的一件事是安装一种叫做 全局钩子 的东西,类型是 WH_MOUSE_LLWH_KEYBOARD_LL。这个钩子可以记录最后一次鼠标或键盘输入的时间,并且这个时间可以被加载了这个DLL的代码读取。把这些数据从DLL传回去有很多种方法,包括但不限于:

  • DLL本身提供一个函数,比如 GetLastActivityTime(),来导出时间戳
  • 命名共享内存
  • 命名管道
  • 邮件插槽
  • 普通的磁盘文件
  • 注册表值
  • TCP通信

...所以我就不详细给出代码示例了。

需要注意的是,类型为 WH_KEYBOARD_LL 的钩子如果你的代码没有数字签名,很可能会被杀毒软件检测为恶意软件,因为使用这种功能的未知代码很可能是一个 键盘记录器

1

你可以使用pynput这个模块来获取用户通过键盘和鼠标输入的信息。这里我做了一个简单的例子,它不考虑控制器的输入。(至少在我的电脑上是这样)

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 {} seconds."


def tell_time():
    global idle_time
    print(txt.format(time() - idle_time))
    idle_time = time()


if __name__ == '__main__':
    KeyListener(on_press=lambda key: tell_time()).start()
    with MouseListener(
            on_move=lambda x, y: tell_time(),
            on_click=lambda x, y, btn, b: tell_time(),
            on_scroll=lambda a, b, c, d: tell_time()
    ) as listener:
        listener.join()

撰写回答