如何检测仅限鼠标/键盘的空闲时间,而不考虑其他输入设备?
GetLastInputInfo()
这个函数可以用来检测用户的空闲时间,比如在 用Python检测空闲时间 的时候,它会对鼠标和键盘的输入很敏感。不过,它也会受到游戏手柄输入的影响,而我希望忽略这些输入。
有没有简单的方法可以做到这一点呢?
一种方法是使用原始输入(Raw Input),比如在 使用winapi读取设备输入时遇到问题 中提到的。这种方法需要用到同步的写和读线程,这样可以记录输入事件,并且可以随时查询这些记录。
2 个回答
0
你可以做的一件事是安装一种叫做 全局钩子 的东西,类型是 WH_MOUSE_LL
和 WH_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()