当前位置: 首页 > news >正文

【使用Python编写游戏辅助工具】第二篇:键盘监听的应用

image.png

前言

这里是【使用Python编写游戏辅助工具】的第二篇:键盘监听的应用。本文主要介绍使用Python实现事件监听功能。

键盘监听是指通过编程的方式监控用户在键盘上的按键操作。

在这里键盘监听的主要用途是:

  • 监听我们按下的按键,如果按下了指定的按钮,则执行我们预先设定的操作,从而实现一些可控的操作;

文章脉络概述

本文的流程和功能如下图所示:

  • 主要实现 键盘监听;

  • 通过键盘监听事件去驱动一些操作(键盘监听功能主要配合后面的鼠标连击使用);

    • 当按下 Ctrl + Shift + A 时候,进行 鼠标连击(键盘的组合键可以自定义)
    • 当按下 Ctrl + Shift + Q 时候,进行 停止连击(键盘的组合键可以自定义)
键盘监听
Ctrl + Shift + A
Ctrl + Shift + Q
执行指定操作
执行指定操作

系列文章脉络

系列文章内容大体如下,后续可能会更新新的文章。

  • 点击直达:【使用Python编写游戏辅助工具】第一篇:概述

  • 点击直达:【使用Python编写游戏辅助工具】第二篇:键盘监听的应用

  • 点击直达:【使用Python编写游戏辅助工具】第三篇:鼠标连击器的实现

  • 点击直达:【使用Python编写游戏辅助工具】第四篇:Windows窗口操作

  • 点击直达:【使用Python编写游戏辅助工具】第五篇:打造交互式游戏工具界面:PySide6/PyQT高效构建GUI工具

知识点📖📖

安装模块

pip install keyboard

据官方介绍,Keyboard 是可以在 WindowsLinuxhook模拟 全局键盘事件的一个模块。

这个模块就可以很好的实现本文的主题。

官网示例⚡⚡

本文的重点是 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模块来监听键盘事件,并通过热键来触发回调函数。它的主要作用是:

  1. 定义了两个回调函数start_keyboard_listenerstop_keyboard_listener,分别用于开始和停止键盘监听;
  2. 使用keyboard.add_hotkey函数注册热键,将热键和相应的回调函数绑定起来。在本例中,按下Ctrl+Shift+A将调用start_keyboard_listener,按下Ctrl+Shift+Q将调用stop_keyboard_listener
  3. 在主程序中,通过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函数。

1686845074653899837.gif

总结🎈🎈

本文介绍了 利用keyboard模块 的基本使用,并且实现键盘监听的操作,

  • 主要使用 keyboardadd_hotkeywait 两个方法来实现。

应用场景如下:

  1. 快捷键操作:通过监听特定的快捷键,实现在特定情况下执行某些操作。例如,当按下Ctrl+Shift+A时开始执行某个任务,按下Ctrl+Shift+Q时停止执行任务。
  2. 自动化脚本:在需要进行键盘监听的自动化脚本中使用。可以根据特定的键盘输入触发相应的操作,从而实现自动化任务的执行。例如,在某个特定的键盘事件发生时,自动触发截图、记录日志等操作。
  3. 辅助工具开发:作为开发辅助工具的一部分,监听键盘事件,以便在特定的触发条件下执行相应的操作。例如,当按下特定的组合键时,显示帮助信息或执行调试操作。

总之,本文代码可以用于监听键盘事件,并根据特定的键盘输入触发相应的操作,与后面的文章结合使用,用以实现鼠标连击的收放自如。

相关文章:

【使用Python编写游戏辅助工具】第二篇:键盘监听的应用

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

Shiny Server和ShinyProxy是什么,有什么区别?

调研以及参与过多个生物公司的生信工具研发,不管是ShinyServer还是ShinyProxy都有一定研究,尤其是ShinyServer。如果仅是本地化测试想快速的搭建Shiny应用,我推荐用Shiny Server,如果多并发用户且更好的线上管理Shiny应用&#xf…...

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行数据(不含标题行),这样用户可以非常方便地选择数据&#xff…...

Maven进阶系列-仓库和镜像

Maven进阶系列-仓库和镜像 文章目录 Maven进阶系列-仓库和镜像1. 仓库1.1 仓库类型1.2 寻找jar的基本优先级顺序&#xff1a;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 &#xff0c;对jenkins进行配置&#xff0c;刚开始需要输入密码 终端会展示密码和密码存放位置 jenkins插件下载地址&#xff0c; 下载后自行上传。 I…...

Mac上的iTerm2和Oh My Zsh 的安装(安装过程和失败详解)

前言&#xff08;无重点&#xff0c;安装往后看&#xff09; 由于在很多人的安利下&#xff0c;说很好用&#xff0c;作者今天花费了4个小时用血的教训总结出来的安装教程&#xff0c;我在安装过程中遇到的最大的问题就是 1. curl: (7) Failed to connect to raw.githubusercon…...

阿里云OS系统Alibaba Cloud Linux 3系统的安全更新命令

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

你写的Python代码到底多快?这些测试工具了解了解

当我们写完一个脚本或一个函数&#xff0c;首先能保证得到正确结果&#xff0c;其次尽可能的快&#xff08;虽然会说Py慢&#xff0c;但有的项目就是得要基于Py开发&#xff09; 本期将总结几种获取程序运行时间的方法&#xff0c;极大的帮助对比不同算法/写法效率 插播&…...

网际控制报文协议ICMP

网际控制报文协议ICMP ​ 为了更有效的转发IP数据报和提高交付成功的机会&#xff0c;在网际层使用ICMP&#xff08;Internet Control Message Protocol&#xff09;协议&#xff0c;其允许主机或路由器报告差错情况和提供有关异常情况的报告。ICMP报文装在IP数据报中&#xf…...

海外腾讯云服务器配置域名的详细说明!!

本文首要针对腾讯云服务器装备域名的问题进行具体的说明&#xff0c;包含域名的品种、注册方法、解析进程以及安全性等方面的介绍&#xff0c;帮助用户更好的理解腾讯云服务器装备域名的全进程。 一、域名的品种 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 该文件&#xff08;rust/library/std/src/os/watchos/mod.rs&#xff09;的作用是为Rust标准库提供支持WatchOS操作系统的特定功能。 W…...

06、Caused by: java.nio.charset.MalformedInputException: Input length = 1

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

探索 Java 8 中的 Stream 流:构建流的多种方式

人嘛&#xff0c;要懂得避嫌… 开篇引入 Java 8引入了Stream流作为一项新的特性&#xff0c;它是用来处理集合数据的一种函数式编程方式。Stream流提供了一种更简洁、高效和易于理解的方法来操作集合数据&#xff0c;同时也能够实现并行处理&#xff0c;以提高性能。 以下是St…...

安卓Apk布局修改从入门到精通

安卓Apk布局修改从入门到精通 课程大纲 本次教程的目标是&#xff0c;学会将安卓apk反向工程后&#xff0c;如何找到需要修改的布局、对布局修改、对布局进行美化&#xff0c;如何隐藏布局&#xff08;按钮等&#xff09;&#xff0c;以及如何在界面上添加按钮并响应点击事件&…...

React Native 样式及其布局

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

基于51单片机的智能指纹考勤系统设计

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

I/O性能优化——这一篇就足够啦

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

【蓝桥杯选拔赛真题44】python小蓝晨跑 青少年组蓝桥杯python 选拔赛STEMA比赛真题解析

目录 python小蓝晨跑 一、题目要求 1、编程实现 2、输入输出 二、算法分析...

摩托车商家做展示预约小程序的作用

摩托车与电动车是人们短距离出行的主要工具&#xff0c;而其使用寿命一般是3年左右及以上、一家可能有多个&#xff0c;市场人群庞大且复购属性强&#xff0c;所以其经营商家也非常多。 如今互联网深入&#xff0c;在品牌宣传、客户获取、信息承载、营销等方面需要车辆经营商家…...

数据库实验:SQL的多表数据查询

目录 实验目的实验内容实验要求实验过程实验代码结果示意 书接上文&#xff0c;但是感觉之前的形式不太好用&#xff0c;至少不是很方便观看&#xff0c;所以这篇尝试改变一下写法&#xff0c;希望可以提升一些观感 实验目的 (1) 掌握RDBMS的数据多表查询功能 (2) 掌握SQL语言…...

【使用Python编写游戏辅助工具】第一篇:概述

引言 欢迎阅读本系列文章&#xff0c;本系列将带领读者朋友们使用Python来实现一个简单而有趣的游戏辅助工具。 写这个系列的缘由源自笔者玩了一款游戏。正巧&#xff0c;笔者对Python编程算是有一定的熟悉&#xff0c;且Python语言具备实现各种有趣功能的能力&#xff0c;因…...

Android与IOS渲染流程对比

目录 Android CPU计算图元信息 GPU干预 几何阶段等后处理 Android APP通过WindowManager统一提供所有Surface的缓冲区【不管是SurfaceView还是普通的布局流程都会将数据提交到Surface的BufferQuene中】 Java中的Surface是null&#xff0c;最终都是由Native层的Surface处理。…...

正则表达式以及 pattern 的撰写方式

正则表达式的撰写方法 在Python中,可以使用re模块来进行正则表达式的撰写和匹配。下面是一个基本的正则表达式撰写方法示例: 导入re模块: python import re定义正则表达式模式: python pattern = r正则表达式其中,r表示原始字符串,可以避免转义字符的问题。 使用re模…...

K8s Error: ImagePullBackOff 故障排除

Error: ImagePullBackOff 故障排除 1. 起因 起因是要在一组k8s环境下做个Prometheus的测试,当时虚拟机用完直接暂停了. 启动完master和node节点后重启了这些节点. 当检查dashboard时候发现Pod处于ImagePullBackOff状态,使用命令查看详细情况 kubectl describe pods -n kuber…...

爬虫之爬虫介绍、requests模块、携带请求参数、url 编码和解码、携带请求头

爬虫介绍 爬虫是什么&#xff1f; 网页蜘蛛&#xff0c;网络机器人&#xff0c;spider在互联网中 通过 程序 自动的抓取数据 的过程根上&#xff1a;使用程序 模拟发送http请求 ⇢ \dashrightarrow ⇢ 得到http响应 ⇢ \dashrightarrow ⇢ 把响应的数据解析出来 ⇢ \dashr…...

pytorch笔记:split

torch.split 是 PyTorch 中的一个函数&#xff0c;用于将张量按指定的大小或张量数量进行分割 1 基本使用方法 torch.split(tensor, split_size_or_sections, dim0)tensor要分割的输入张量split_size_or_sections以是整数或整数列表。 如果是整数&#xff0c;那么它表示每个分…...

K8S运维 解决openjdk:8-jdk-alpine镜像时区和字体问题

目录 一、问题 二、解决 三、完整代码 一、问题 由于项目的Dockerfile中使用openjdk:8-jdk-alpine作为基础镜像来部署服务&#xff0c;此镜像存在一定问题&#xff0c;例如时差8小时问题&#xff0c;或是由于字体问题导致导出excel文件&#xff0c;图片处理内容为空等。 二…...

Kubectl详解(陈述式、声明式)

目录 1、陈述式资源管理方法 1.1 基本信息查看 1.2 项目的生命周期&#xff1a;创建-->发布-->更新-->回滚-->删除 1.3 金丝雀发布&#xff08;Canary Release&#xff09; 2、声明式管理方法 1、陈述式资源管理方法 1.kubernetes 集群管理集群资源的唯一入口是…...