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根据经纬度计算距离示例
Feb 16 Python
使用相同的Apache实例来运行Django和Media文件
Jul 22 Python
python 写的一个爬虫程序源码
Feb 28 Python
Django 连接sql server数据库的方法
Jun 30 Python
Python小游戏之300行代码实现俄罗斯方块
Jan 04 Python
python3实现猜数字游戏
Dec 07 Python
在django模板中实现超链接配置
Aug 21 Python
python图片剪裁代码(图片按四个点坐标剪裁)
Mar 10 Python
Python logging模块进行封装实现原理解析
Aug 07 Python
python pip如何手动安装二进制包
Sep 30 Python
关于Python错误重试方法总结
Jan 03 Python
一文搞懂如何实现Go 超时控制
Mar 30 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 常用类汇总 推荐收藏
2010/05/13 PHP
php实现指定字符串中查找子字符串的方法
2015/03/17 PHP
php修改文件上传限制方法汇总
2015/04/07 PHP
解决出现SoapFault (looks like we got no XML document)的问题
2017/06/24 PHP
javascript开发技术大全-第1章javascript概述
2011/07/03 Javascript
一些常用弹出窗口/拖放/异步文件上传等实用代码
2013/01/06 Javascript
JQuery中的事件及动画用法实例
2015/01/26 Javascript
vue2.0实战之基础入门(1)
2017/03/27 Javascript
让nodeJS支持ES6的词法----babel的安装和使用方法
2017/07/31 NodeJs
js使用highlight.js高亮你的代码
2017/08/18 Javascript
原生js实现省市区三级联动代码分享
2018/02/12 Javascript
Vue.directive 自定义指令的问题小结
2018/03/04 Javascript
妙用缓存调用链实现JS方法的重载
2018/04/30 Javascript
详解webpack loader和plugin编写
2018/10/12 Javascript
JS使用数组实现的队列功能示例
2019/03/04 Javascript
node(koa2) web应用模块介绍详解
2019/03/29 Javascript
微信小程序实现收货地址左滑删除
2020/11/18 Javascript
vue实现数字动态翻牌的效果(开箱即用)
2019/12/08 Javascript
Vue父组件监听子组件生命周期
2020/09/03 Javascript
OpenLayer学习之自定义测量控件
2020/09/28 Javascript
jQuery实现手风琴特效
2021/01/11 jQuery
[08:54]DOTA2-DPC中国联赛 正赛 Aster vs LBZS 选手采访
2021/03/11 DOTA
Python实现的Excel文件读写类
2015/07/30 Python
python中struct模块之字节型数据的处理方法
2019/08/27 Python
win10下opencv-python特定版本手动安装与pip自动安装教程
2020/03/05 Python
Python如何使用队列方式实现多线程爬虫
2020/05/12 Python
python自动从arxiv下载paper的示例代码
2020/12/05 Python
100%有机精油,美容油:House of Pure Essence
2018/10/30 全球购物
Otiumberg官网:英国半精致珠宝品牌
2021/01/16 全球购物
红领巾广播站广播稿
2014/02/01 职场文书
国际贸易本科毕业生求职信
2014/09/26 职场文书
2014年仓库管理员工作总结
2014/11/18 职场文书
2014年教师业务工作总结
2014/12/19 职场文书
迟到检讨书范文
2015/01/27 职场文书
Windows中Redis安装配置流程并实现远程访问功能
2021/06/07 Redis
golang fmt格式“占位符”的实例用法详解
2021/07/04 Golang