python 偷懒技巧——使用 keyboard 录制键盘事件


Posted in Python onSeptember 21, 2020

之前在某本书上看到一个程序,可以通过 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)

python 偷懒技巧——使用 keyboard 录制键盘事件

可以使用如下代码制作一个简单的 “键盘录制器” (打印输出全局范围内的按键动作,并将按键顺序保存在文本文件中):

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()

python 偷懒技巧——使用 keyboard 录制键盘事件

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.")

python 偷懒技巧——使用 keyboard 录制键盘事件

其他的使用方式就不再一一列举了,可以参考 keyboard 项目的 Github 主页 。

几种常见的使用示例也已经包含在项目代码的 examples 目录下。

以上就是python 偷懒技巧——使用 keyboard 录制键盘事件的详细内容,更多关于python keyboard 录制键盘事件的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python中unittest用法实例
Sep 25 Python
简单介绍Python2.x版本中的cmp()方法的使用
May 20 Python
详解Python字符串对象的实现
Dec 24 Python
Python外星人入侵游戏编程完整版
Mar 30 Python
Python进阶学习之特殊方法实例详析
Dec 01 Python
django在接受post请求时显示403forbidden实例解析
Jan 25 Python
详解Django 中是否使用时区的区别
Jun 14 Python
Python 实现域名解析为ip的方法
Feb 14 Python
pygame实现飞机大战
Mar 11 Python
浅谈Keras的Sequential与PyTorch的Sequential的区别
Jun 17 Python
Python3爬虫ChromeDriver的安装实例
Feb 06 Python
python使用pycharm安装pyqt5以及相关配置
Apr 22 Python
简单了解python关键字global nonlocal区别
Sep 21 #Python
PIP和conda 更换国内安装源的方法步骤
Sep 21 #Python
python 字符串格式化的示例
Sep 21 #Python
基于python判断字符串括号是否闭合{}[]()
Sep 21 #Python
属性与 @property 方法让你的python更高效
Sep 21 #Python
Python如何在bool函数中取值
Sep 21 #Python
python 密码学示例——凯撒密码的实现
Sep 21 #Python
You might like
开启PHP的伪静态模式
2015/12/31 PHP
php断点续传之文件分割合并详解
2016/12/13 PHP
php处理抢购类功能的高并发请求
2018/02/08 PHP
PHP MVC框架中类的自动加载机制实例分析
2019/09/18 PHP
javaScript 读取和设置文档元素的样式属性
2009/04/14 Javascript
JS字符串累加Array不一定比字符串累加快(根据电脑配置)
2012/05/14 Javascript
javascript控制swfObject应用介绍
2012/11/29 Javascript
基于javascipt-dom编程 table对象的使用
2013/04/22 Javascript
用js读、写、删除Cookie代码分享及详细注释说明
2014/06/05 Javascript
基于jQuery实现Div窗口震动特效代码-代码简单
2015/08/28 Javascript
快速学习JavaScript的6个思维技巧
2015/10/13 Javascript
JavaScript判断变量是否为数组的方法(Array)
2016/02/24 Javascript
Node.js操作mysql数据库增删改查
2016/03/30 Javascript
jQuery实用小技巧_输入框文字获取和失去焦点的简单实例
2016/08/25 Javascript
细说webpack源码之compile流程-rules参数处理技巧(1)
2017/12/26 Javascript
angular写一个列表的选择全选交互组件的示例
2018/01/22 Javascript
关于jquery中attr()和prop()方法的区别
2018/05/28 jQuery
layer.open回调获取弹出层参数的实现方法
2019/09/10 Javascript
JS中的模糊查询功能
2019/12/08 Javascript
手机浏览器唤起微信分享(JS)
2020/10/11 Javascript
[02:09:59]火猫TV国士无双dota2 6.82版本详解(下)
2014/09/29 DOTA
[01:15:29]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#2Secret VS EG第三局
2016/03/04 DOTA
python使用datetime模块计算各种时间间隔的方法
2015/03/24 Python
python简单实现基数排序算法
2015/05/16 Python
使用python将多个excel文件合并到同一个文件的方法
2019/07/09 Python
flask框架单元测试原理与用法实例分析
2019/07/23 Python
css3实现多个元素依次显示效果
2017/12/12 HTML / CSS
css3 矩阵的使用详解
2018/03/20 HTML / CSS
毕业班联欢会主持词
2014/03/27 职场文书
党员干部廉洁承诺书
2014/05/28 职场文书
2015幼儿园新学期寄语
2015/02/27 职场文书
小学安全工作总结2015
2015/05/18 职场文书
2015年小学数学教师个人工作总结
2015/05/25 职场文书
mysql幻读详解实例以及解决办法
2022/06/16 MySQL
springboot读取resources下文件的方式详解
2022/06/21 Java/Android
SQL语句中EXISTS的详细用法大全
2022/06/25 MySQL