当前位置: 首页 > 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、输入输出 二、算法分析...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题&#xff0c; 因为搜索范围是有界的&#xff0c;上界最大木板长度补充的全部木料长度&#xff0c;下界最小木板长度&#xff1b; 即left0,right10^6; 我们可以设置一个候选值x(mid)&#xff0c;将木板的长度全部都补充到x&#xff0c;如果成功…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中&#xff0c;工业自动化网关起着至关重要的作用&#xff0c;尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关&#xff0c;为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多&#xff0c;其中不少设备采用Devicenet协议。Devicen…...

DiscuzX3.5发帖json api

参考文章&#xff1a;PHP实现独立Discuz站外发帖(直连操作数据库)_discuz 发帖api-CSDN博客 简单改造了一下&#xff0c;适配我自己的需求 有一个站点存在多个采集站&#xff0c;我想通过主站拿标题&#xff0c;采集站拿内容 使用到的sql如下 CREATE TABLE pre_forum_post_…...

React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构

React 实战项目&#xff1a;微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇&#xff01;在前 29 篇文章中&#xff0c;我们从 React 的基础概念逐步深入到高级技巧&#xff0c;涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...

Python的__call__ 方法

在 Python 中&#xff0c;__call__ 是一个特殊的魔术方法&#xff08;magic method&#xff09;&#xff0c;它允许一个类的实例像函数一样被调用。当你在一个对象后面加上 () 并执行时&#xff08;例如 obj()&#xff09;&#xff0c;Python 会自动调用该对象的 __call__ 方法…...

Java中HashMap底层原理深度解析:从数据结构到红黑树优化

一、HashMap概述与核心特性 HashMap作为Java集合框架中最常用的数据结构之一&#xff0c;是基于哈希表的Map接口非同步实现。它允许使用null键和null值&#xff08;但只能有一个null键&#xff09;&#xff0c;并且不保证映射顺序的恒久不变。与Hashtable相比&#xff0c;Hash…...