python 偷懒技巧——使用 keyboard 录制键盘事件
作者:starryland 发布时间:2023-02-08 18:00:03
之前在某本书上看到一个程序,可以通过 Python 记录下全局范围内的键盘事件,使用的是 ctypes 库。
后来几经尝试,始终不能成功运行。原来它只支持 Python2 和 32 位的 Windows 系统。。。Excuse me?
于是在网上查找可行的替代方案,比如 pyHook 。呃,不合胃口。安装比较繁琐(有依赖库且不能通过 pip 命令安装),只支持 Windows 系统,况且又是十年前就没再更新的项目。。。看了下函数调用也算不上简洁直观。
后来又多番搜索,终于找到了一个名为keyboard 的 Python 库,可以绑定全局事件、录制及模拟键盘输入、设置热键等。
尤其是安装和使用足够简单,比较合我的心意(毕竟 Github 上将近 1.5K 的小星星)。
一、特性
全局范围内的键盘事件绑定。即程序可以后台运行,捕捉其他软件下的按键动作。
跨平台,支持 Windows 、Linux 以及 MacOS 系统。支持 Python2 和 Python3 。
纯 Python 代码,无需编译 C 语言模块。无依赖库,安装简单(只是复制文件就可以)。
通过独立的线程捕捉事件,不阻塞主程序的运行。
很详细的文档,参见项目主页的 README 。
其实我真的有点感觉,这才是我心目中比较“现代”的工具。
二、录制及模拟按键动作
就像前面提到的,安装 keyboard 的流程非常简单,无需考虑任何兼容性或者依赖问题,只需要一条简短的命令:
$ pip install keyboard
可以使用下面的代码录制 10 秒钟的键盘事件,并将其回放一遍(即重复按下之前操作的按键):
import keyboard
import time
keyboard.start_recording()
time.sleep(10)
events = keyboard.stop_recording()
keyboard.replay(events)
可以使用如下代码制作一个简单的 “键盘录制器” (打印输出全局范围内的按键动作,并将按键顺序保存在文本文件中):
import keyboard
def print_pressed_keys(e):
line = ', '.join(str(code) for code in keyboard._pressed_events)
print(line)
with open('keylogger.txt', 'a+') as f:
f.write(line + '\n')
keyboard.hook(print_pressed_keys)
keyboard.wait()
PS:上述代码中的 code 并不是对应按键的 ASCII 码,而是根据键盘布局为按键指定的数值(如 a 键为 30,b 键为 42 等等),可以通过自行测试确认具体的对应关系。
如同时按下两个或多个按键,则上述程序会以 code, code... 的形式输出。
三、热键捕获及绑定
可以使用如下代码录制热键并为该热键绑定上特定的触发事件:
import keyboard
print('Press and release your desired hotkey: ')
hotkey = keyboard.read_hotkey()
print('Hotkey selected: ', hotkey)
def on_triggered():
print("Triggered!")
keyboard.add_hotkey(hotkey, on_triggered)
print("Press ESC to stop.")
其他的使用方式就不再一一列举了,可以参考 keyboard 项目的 Github 主页 。
几种常见的使用示例也已经包含在项目代码的 examples 目录下。
来源:https://rollingstarky.github.io/2019/05/11/python-capture-keyboard-events/?utm_source=tuicool&utm_medium=referral


猜你喜欢
- 实现制作抽奖程序,需要认知到我们可以看到一般抽奖程序界面上是有很多按钮的,比如中奖区域,按键开始区域等等,所以我们先要设置界面,然后把这些按
- 前言MySQL 的权限表在数据库启动的时候就载入内存,当用户通过身份认证后,就在内存中进行相应权限的存取,这样,此用户就可以在数据库中做权限
- 详解 Python 读写XML文件的实例Python 生成XML文件from xml.dom import minidom# 生成XML文件
- Beautiful Soup 库一般被称为bs4库,支持Python3,是我们写爬虫非常好的第三方库。因用起来十分的简便流畅。所以也被人叫做
- 如何用Python搞到小姐姐私房照本文纯技术角度出发,教你如何用Python爬虫获取百度图库海量照片——技术无罪。学会获取小姐姐私房照同理可
- 〇、前言文件上传/下载接口与普通接口类似,但是有细微的区别。如果需要发送文件到服务器,例如:上传文档、图片、视频等,就需要发送二进制数据,上
- package 的导入语法写 Go 代码的时经常用到 import 这个命令用来导入包,参考如下:import( "f
- 增大 SGA 已经缓冲看来对于性能的提升并不显著,加载时间只提升了 1.73%。下面我们增加 SGA 重做日志的大小: DB3: Log B
- 玩QQ桌球游戏时,有时候用鼠标控制鼠标指针的微小移动比较费劲儿,所以想写个程序,可以用键盘的上下左右键来控制鼠标的移动,每次只移动一个像素。
- 使用Numpy创建三维矩阵创建语句#创建形式有两种#1 随机数形式np.random.random((x,y,z))#2 0或1形式np.o
- 纵观各大编程语言在 2017 年的发展情况,我们会发现涌现出诸如 Go、Swift 这类后起之秀,而其中最为耀眼的当属 Python。之所以
- strftime()函数的用法strftime()函数可以把YYYY-MM-DD HH:MM:SS格式的日期字符串转换成其它形式的字符串。s
- 手写数字识别(小白入门)今早刚刚上了节实验课,关于逻辑回归,所以手有点刺挠就想发个博客,作为刚刚入门的小白,看到代码运行成功就有点小激动,这
- 线性判别分析(linear discriminant analysis),LDA。也称为Fisher线性判别(FLD)是模式识别的经典算法。
- 教你配置属于自己的PYcharm界面色彩风格,PYthon学习必备 GO第一步,换成深色背景,保护视力PyCharm默认的背景是白色的,比较
- 一、serialize()方法格式:var data = $("#formID").serialize();功能:将表单
- WSGI(Web Server Gateway Interface):Web服务网关接口,是Python中定义的服务器程序和应用程序之间的接
- 今天来说一下,有些刚刚接触python的朋友,在使用pip install安装python 第三方库的过程中会出现网速很慢,或者是安装下载到
- 是的,我在这里要说:注册表单将死(好拗口啊,但是不知道怎么翻译更恰当)。回想一下,当你想享受一个网站服务的时候,碰到的第一件事是什么?一个表
- 本文实例讲述了javascript使用Blob对象实现的下载文件操作。分享给大家供大家参考,具体如下:Blob对象前言环境操作总结Blob是