如何在Python程序不在前景时读取按键?

6 投票
4 回答
10919 浏览
提问于 2025-04-15 12:32

我想在接下来的一个月里分析我的键盘输入,想写一个简单的程序来实现这个目标。我不想详细记录每一个命令,只是想生成一些关于我按键的总体统计数据。

我最擅长用Python来编程,但也愿意听听其他的建议。这种事情可行吗?如果可以的话,我应该看看哪些Python模块?有没有人已经做过类似的事情?

我现在使用的是OSX,但也对在Ubuntu和Windows XP上做这个感兴趣。

4 个回答

2

由于当前的X服务器的Record扩展似乎有问题,所以在Linux上使用pykeylogger并没有什么帮助。你可以看看evdev和它的demo功能。这个解决方案虽然有点复杂,但至少是有效的。

这个方法主要是要设置一个钩子来连接设备。

import evdev
keyboard_location = '/dev/input/event1'  # get the correct one from HAL or so
keyboard_device = evdev.Device(keyboard_location)

然后,定期检查设备,以获取按键状态和其他信息:

keyboard_device.poll()
2

除非你打算自己编写接口,否则你需要一些库来帮助你,因为正如其他人提到的,你需要访问由桌面环境管理的低级按键事件。

在Windows系统上,你可以使用PyHook这个库,它能提供你所需的功能。

在Linux系统上,你可以使用Python X库(前提是你在使用图形桌面)。

这两个库都被pykeylogger很好地使用了。你最好下载源代码(比如pyxhook.py),看看具体是如何捕捉按键事件的。修改这些代码来统计按键的分布,而不是记录按键的顺序,应该是很简单的。

4

看起来你需要这个工具:http://patorjk.com/keyboard-layout-analyzer/

这个实用的程序可以分析一段文字,告诉你打字时手指移动了多远,然后推荐最适合你的键盘布局。

关于你最初的问题,在Linux系统中,你可以从/dev/event*读取本地键盘、鼠标和游戏手柄的事件。比如你可以简单地用命令cat /dev/event0 > keylogger来实现。这里的事件是struct input_event的实例。你也可以查看这个链接了解更多:http://www.linuxjournal.com/article/6429

Python的struct模块是解析二进制数据的一个方便工具。

如果你使用的是OSX,可以看看logkext的源代码。这里是链接:http://code.google.com/p/logkext/

撰写回答