【使用Python编写游戏辅助工具】第二篇:键盘监听的应用
前言
这里是【使用Python编写游戏辅助工具】的第二篇:键盘监听的应用。本文主要介绍使用
Python
实现事件监听功能。
键盘监听是指通过编程的方式监控用户在键盘上的按键操作。
在这里键盘监听的主要用途是:
- 监听我们按下的按键,如果按下了指定的按钮,则执行我们预先设定的操作,从而实现一些可控的操作;
文章脉络概述
本文的流程和功能如下图所示:
-
主要实现 键盘监听;
-
通过键盘监听事件去驱动一些操作(
键盘监听
功能主要配合后面的鼠标连击
使用);- 当按下 Ctrl + Shift + A 时候,进行 鼠标连击(键盘的组合键可以自定义)
- 当按下 Ctrl + Shift + Q 时候,进行 停止连击(键盘的组合键可以自定义)
系列文章脉络
系列文章内容大体如下,后续可能会更新新的文章。
-
点击直达:【使用Python编写游戏辅助工具】第一篇:概述
-
点击直达:【使用Python编写游戏辅助工具】第二篇:键盘监听的应用
-
点击直达:【使用Python编写游戏辅助工具】第三篇:鼠标连击器的实现
-
点击直达:【使用Python编写游戏辅助工具】第四篇:Windows窗口操作
-
点击直达:【使用Python编写游戏辅助工具】第五篇:打造交互式游戏工具界面:PySide6/PyQT高效构建GUI工具
知识点📖📖
安装模块
pip install keyboard
据官方介绍,Keyboard 是可以在 Windows 和 Linux 上 hook 和模拟 全局键盘事件的一个模块。
这个模块就可以很好的实现本文的主题。
官网示例⚡⚡
本文的重点是 Keyboard模块,项目地址在这:https://github.com/boppreh/keyboard 。
笔者在这里不去详细介绍 keyboard 的功效,它的功能很强大,这里列举下常用的方法:
- 系统的学习应该去它的项目网站。
方法/函数 | 描述 |
---|---|
keyboard.is_pressed(key) | 检查给定的键是否当前按下。返回布尔值,表示键是否按下。 |
keyboard.press(key) | 模拟按下给定的键。 |
keyboard.release(key) | 模拟释放给定的键。 |
keyboard.write(text) | 模拟键盘输入给定的文本。 |
keyboard.press_and_release(key) | 模拟按下和释放给定的键。 |
keyboard.hotkey(key1, key2, ..., keyN) | 模拟同时按下给定的多个键。 |
keyboard.wait(key) | 阻塞程序,直到给定的键被按下。 |
keyboard.add_hotkey(key, callback) | 注册一个热键,当按下指定的键时,调用指定的回调函数。 |
keyboard.remove_hotkey(key) | 移除先前注册的热键。 |
keyboard.read_event() | 阻塞程序,直到键盘事件发生,并返回一个keyboard.KeyboardEvent 对象,包含有关事件的详细信息。 |
keyboard.record(events=True) | 记录用户的键盘输入,并返回一个包含事件的列表。如果events 为False,仅记录按键和释放事件(不包括其他事件)。 |
代码
在官方示例拿来了这段 Example:https://github.com/boppreh/mouse#Example
- 这段代码展示了
keyboard
库的一些常见用法,包括模拟按键操作、注册热键、记录和回放事件等。下面我来尝试解释一下这段代码。
import keyboardkeyboard.press_and_release('shift+s, space')keyboard.write('The quick brown fox jumps over the lazy dog.')keyboard.add_hotkey('ctrl+shift+a', print, args=('triggered', 'hotkey'))# Press PAGE UP then PAGE DOWN to type "foobar".
keyboard.add_hotkey('page up, page down', lambda: keyboard.write('foobar'))# Blocks until you press esc.
keyboard.wait('esc')# Record events until 'esc' is pressed.
recorded = keyboard.record(until='esc')
# Then replay back at three times the speed.
keyboard.play(recorded, speed_factor=3)# Type @@ then press space to replace with abbreviation.
keyboard.add_abbreviation('@@', 'my.long.email@example.com')# Block forever, like `while True`.
keyboard.wait()
代码释义
导入了keyboard
模块
import keyboard
这行代码模拟按下并释放了组合键Shift+S
,然后按下并释放了空格键。
keyboard.press_and_release('shift+s, space')
这行代码将字符串The quick brown fox jumps over the lazy dog.
写入当前焦点的应用程序。相当于模拟了键盘的按键输入。
keyboard.write('The quick brown fox jumps over the lazy dog.')
这行代码注册了一个热键Ctrl+Shift+A
,当用户按下该组合键时,回调函数print
将被调用,并将参数('triggered', 'hotkey')
传递给该回调函数。
keyboard.add_hotkey('ctrl+shift+a', print, args=('triggered', 'hotkey'))
这行代码注册了一个热键Page Up, Page Down
,当用户按下该组合键时,将调用一个匿名函数,该匿名函数会将字符串foobar
写入当前焦点的应用程序。
keyboard.add_hotkey('page up, page down', lambda: keyboard.write('foobar'))
这行代码阻塞程序,直到用户按下Esc
键为止。
keyboard.wait('esc')
这行代码记录键盘事件,直到用户按下Esc
键为止,并将记录的事件存储在recorded
变量中。
recorded = keyboard.record(until='esc')
这行代码将之前记录的键盘事件以三倍的速度回放。
keyboard.play(recorded, speed_factor=3)
这行代码注册了一个缩写,当用户输入@@
并按下空格键时,会自动替换为my.long.email@example.com
。
keyboard.add_abbreviation('@@', 'my.long.email@example.com')
这行代码将程序无限阻塞,类似于while True
的效果,直到用户终止程序。
keyboard.wait()
键盘监听 实现✨✨
因为本篇文章需要实现的是监听键盘操作,所以需要关心的是 keyboard 的两个操作:
- keyboard.add_hotkey:注册热键,接受一个热键和回调函数;
- keyboard.wait:监听程序,直到给定的键被按下。
代码
代码释义
这段代码使用了keyboard
模块来监听键盘事件,并通过热键来触发回调函数。它的主要作用是:
- 定义了两个回调函数
start_keyboard_listener
和stop_keyboard_listener
,分别用于开始和停止键盘监听; - 使用
keyboard.add_hotkey
函数注册热键,将热键和相应的回调函数绑定起来。在本例中,按下Ctrl+Shift+A
将调用start_keyboard_listener
,按下Ctrl+Shift+Q
将调用stop_keyboard_listener
; - 在主程序中,通过
keyboard.wait('ctrl+c')
进入监听状态,等待用户按下Ctrl+C
来终止程序。
请注意,代码中的time.sleep(5)
用于模拟执行某些操作时的时间延迟,可以根据需要进行调整或移除。
另外,except KeyboardInterrupt
用于捕获用户按下Ctrl+C
的中断信号,以便优雅地退出程序或执行相应的处理逻辑。
import time
import keyboarddef start_keyboard_listener():"""开始键盘监听的回调函数"""print("Ctrl+Shift+A pressed")time.sleep(5)# do somethingdef stop_keyboard_listener():"""停止键盘监听的回调函数"""print("Ctrl+Shift+Q pressed")time.sleep(5)# do something# 注册热键,设置回调函数
keyboard.add_hotkey('Ctrl+Shift+A', start_keyboard_listener)
keyboard.add_hotkey('Ctrl+Shift+Q', stop_keyboard_listener)# 进入监听状态
try:keyboard.wait('ctrl+c')
except KeyboardInterrupt:...
运行效果
可以清楚的看到(看坐上角的 键盘显示
),
- 当按下键盘的 Ctrl + Shift + A 时候,执行了start_keyboard_listener函数;
- 当按下键盘的 Ctrl + Shift + Q 时候,执行了 stop_keyboard_listener函数。
总结🎈🎈
本文介绍了 利用keyboard模块 的基本使用,并且实现键盘监听的操作,
- 主要使用 keyboard 的 add_hotkey 和 wait 两个方法来实现。
应用场景如下:
- 快捷键操作:通过监听特定的快捷键,实现在特定情况下执行某些操作。例如,当按下
Ctrl+Shift+A
时开始执行某个任务,按下Ctrl+Shift+Q
时停止执行任务。 - 自动化脚本:在需要进行键盘监听的自动化脚本中使用。可以根据特定的键盘输入触发相应的操作,从而实现自动化任务的执行。例如,在某个特定的键盘事件发生时,自动触发截图、记录日志等操作。
- 辅助工具开发:作为开发辅助工具的一部分,监听键盘事件,以便在特定的触发条件下执行相应的操作。例如,当按下特定的组合键时,显示帮助信息或执行调试操作。
总之,本文代码可以用于监听键盘事件,并根据特定的键盘输入触发相应的操作,与后面的文章结合使用,用以实现鼠标连击的收放自如。
相关文章:

【使用Python编写游戏辅助工具】第二篇:键盘监听的应用
前言 这里是【使用Python编写游戏辅助工具】的第二篇:键盘监听的应用。本文主要介绍使用Python实现事件监听功能。 键盘监听是指通过编程的方式监控用户在键盘上的按键操作。 在这里键盘监听的主要用途是: 监听我们按下的按键,如果按下了指…...

Shiny Server和ShinyProxy是什么,有什么区别?
调研以及参与过多个生物公司的生信工具研发,不管是ShinyServer还是ShinyProxy都有一定研究,尤其是ShinyServer。如果仅是本地化测试想快速的搭建Shiny应用,我推荐用Shiny Server,如果多并发用户且更好的线上管理Shiny应用…...
Java 客户端、服务端NIO大文件传输
一、需求 公司电脑不让使用U盘,又不想通过公司聊天软件传输,怕被监控。但是通过QQ、微信传输文件对文件大小又有限制。基于种种原因,自己简单写了个服务端、客户端进行文件传输,大文件最好在局域网内进行数据传输。 二、pom依赖…...

Unity3D与iOS的交互 简单版开箱即用
本文适合的情况如下: Unity客户端人员 与 IOS端研发人员合作的情况 目录 From U3D to iOS 实现原理 1.unity工程目录创建2个文件 NativeCallProxy.m、NativeCallProxy.h 并且放到Unity工程目录Plugins/iOS/unity_ios_plus目录下 2.创建C#调用脚本 定义对应.mm脚…...

限制LitstBox控件显示指定行数的最新数据(3/3)
实例需求:由于数据行数累加增加,控件加载的数据越来越多,每次用户都需要使用右侧滚动条拖动才能查看最新数据。 因此希望ListBox只加载最后10行数据(不含标题行),这样用户可以非常方便地选择数据ÿ…...

Maven进阶系列-仓库和镜像
Maven进阶系列-仓库和镜像 文章目录 Maven进阶系列-仓库和镜像1. 仓库1.1 仓库类型1.2 寻找jar的基本优先级顺序:1.3 仓库优先次序验证示例 2. settings.xml文件2.1 mirrors2.1.1 没有配置mirror2.1.2 配置了mirror2.1.3 <mirrorOf> 2.2 servers2.3 profiles …...

mac下载安装jenkins
下载 https://get.jenkins.io/war/ 启动 使用命令行启动 java -jar jenkins.war 浏览器访问 IP:8080 或 localhost:8080 ,对jenkins进行配置,刚开始需要输入密码 终端会展示密码和密码存放位置 jenkins插件下载地址, 下载后自行上传。 I…...

Mac上的iTerm2和Oh My Zsh 的安装(安装过程和失败详解)
前言(无重点,安装往后看) 由于在很多人的安利下,说很好用,作者今天花费了4个小时用血的教训总结出来的安装教程,我在安装过程中遇到的最大的问题就是 1. curl: (7) Failed to connect to raw.githubusercon…...

阿里云OS系统Alibaba Cloud Linux 3系统的安全更新命令
给客户部署的服务,进入运维阶段,但是经常被客户监测到服务器漏洞,现在整理一下,服务器漏洞问题更新命令步骤。 服务器系统: 阿里云linux服务器:Alibaba Cloud Linux 3 漏洞类型和描述: #3214…...

你写的Python代码到底多快?这些测试工具了解了解
当我们写完一个脚本或一个函数,首先能保证得到正确结果,其次尽可能的快(虽然会说Py慢,但有的项目就是得要基于Py开发) 本期将总结几种获取程序运行时间的方法,极大的帮助对比不同算法/写法效率 插播&…...

网际控制报文协议ICMP
网际控制报文协议ICMP 为了更有效的转发IP数据报和提高交付成功的机会,在网际层使用ICMP(Internet Control Message Protocol)协议,其允许主机或路由器报告差错情况和提供有关异常情况的报告。ICMP报文装在IP数据报中…...
海外腾讯云服务器配置域名的详细说明!!
本文首要针对腾讯云服务器装备域名的问题进行具体的说明,包含域名的品种、注册方法、解析进程以及安全性等方面的介绍,帮助用户更好的理解腾讯云服务器装备域名的全进程。 一、域名的品种 1.域名是互联网上仅有标识一台计算机或一个网络资源的名称&#…...

听GPT 讲Rust源代码--library/std(12)
题图来自 Decoding Rust: Everything You Need to Know About the Programming Language[1] File: rust/library/std/src/os/watchos/mod.rs 该文件(rust/library/std/src/os/watchos/mod.rs)的作用是为Rust标准库提供支持WatchOS操作系统的特定功能。 W…...

06、Caused by: java.nio.charset.MalformedInputException: Input length = 1
目录 问题:原因:解决方法: 问题: Caused by: java.nio.charset.MalformedInputException: Input length 1 原因: 应该是中文有哪些文字导致的。 yml 编码格式出错 解决方法: 直接这里把GBK改成 utf-8…...

探索 Java 8 中的 Stream 流:构建流的多种方式
人嘛,要懂得避嫌… 开篇引入 Java 8引入了Stream流作为一项新的特性,它是用来处理集合数据的一种函数式编程方式。Stream流提供了一种更简洁、高效和易于理解的方法来操作集合数据,同时也能够实现并行处理,以提高性能。 以下是St…...
安卓Apk布局修改从入门到精通
安卓Apk布局修改从入门到精通 课程大纲 本次教程的目标是,学会将安卓apk反向工程后,如何找到需要修改的布局、对布局修改、对布局进行美化,如何隐藏布局(按钮等),以及如何在界面上添加按钮并响应点击事件&…...

React Native 样式及其布局
React Native 样式及其布局 参考 https://reactnative.cn/docs/flexbox 一、样式 在 React Native 中,你并不需要学习什么特殊的语法来定义样式。我们仍然是使用 JavaScript 来写样式。所有的核心组件都接受名为style的属性。这些样式名基本上是遵循了 web 上的 …...

基于51单片机的智能指纹考勤系统设计
**单片机设计介绍,1661【毕设课设】基于51单片机的智能指纹考勤系统设计-原理图-PCB-程序-报告 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于51单片机的智能指纹考勤系统是一种利用51单片机作为主控芯片&#x…...

I/O性能优化——这一篇就足够啦
背景 继上一篇CPU性能优化文章 ,本次向大家分享关于I/O性能优化的分析套路以及常见措施。后续还有关于内存及网络优化的篇章。 基本概念 对于I/O我们先了解几个概念,文件系统,磁盘,文件。 磁盘 磁盘为系统提供了最基本的持久化存…...

【蓝桥杯选拔赛真题44】python小蓝晨跑 青少年组蓝桥杯python 选拔赛STEMA比赛真题解析
目录 python小蓝晨跑 一、题目要求 1、编程实现 2、输入输出 二、算法分析...

铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...