Python使用pynput模块后台监控鼠标及按键
Pynput 是一个 Python 第三方库,它提供了监听和控制键盘和鼠标事件的功能。使用 pynput,我们可以编写自动化脚本,监控输入设备的活动,或者实现一些与键盘和鼠标相关的功能。
一、功能说明
这段代码是运用pynput库实现对鼠标和键盘事件的监听和处理的一个完整示例,并在控制台中实时打印出相关事件的信息。
- 当你移动鼠标时,程序会捕获鼠标的移动事件,并在控制台打印出鼠标的当前位置,包括横坐标(x)和纵坐标(y)。
- 当你按下或释放鼠标的左键、右键或中键时,程序会捕获这些按键事件,并在控制台打印出按键的状态(按下或释放)以及鼠标当前的位置。
- 此外,当你按下或释放键盘上的任意按键时,程序同样会捕获这些键盘事件。对于能够打印出字符的按键(如字母、数字、标点符号等),程序会在控制台打印出该按键对应的字符表示;对于无法直接打印出字符的特殊按键(如功能键、控制键等),程序会打印出按键本身的信息。
from pynput import mouse, keyboard def on_mouse_move(x, y): print(f'鼠标移动到位置: ({x}, {y})') def on_mouse_click(x, y, button, pressed): if pressed: print(f'{button} 按下于位置: ({x}, {y})') else: print(f'{button} 释放于位置: ({x}, {y})')
def on_mouse_scroll(x, y, dx, dy):# dx 和 dy 表示滚动的水平方向和垂直方向的量 # 在大多数鼠标上,只有 dy 会变化,表示垂直滚动 print(f'Scrolled at {x}, {y} ({dx}, {dy})') def on_key_press(key): try: print(f'{key.char} 被按下') except AttributeError: print(f'{key} 被按下') def on_key_release(key): try: if key == keyboard.Key.esc:print('结束监听,退出!')keyboard_listener.stop()mouse_listener.stop()else :print(f'{key.char} 被释放') except AttributeError: print(f'{key} 被释放') # 创建鼠标监听器
mouse_listener = mouse.Listener(on_move=on_mouse_move, on_click=on_mouse_click,on_scroll=on_mouse_scroll)
mouse_listener.start() # 创建键盘监听器,同时监听按下和释放事件
keyboard_listener = keyboard.Listener(on_press=on_key_press, on_release=on_key_release)
keyboard_listener.start() # 等待监听器运行,直到用户手动停止
try: mouse_listener.join() keyboard_listener.join()
except KeyboardInterrupt: pass # 捕获 Ctrl+C 来停止监听器
finally: # 停止监听器 mouse_listener.stop() keyboard_listener.stop()
它首先导入了 pynput库中的 mouse和 keyboard模块,这两个模块分别用于处理鼠标和键盘事件。
在代码中,定义了几个回调函数,这些函数会在特定的事件发生时被调用。on_mouse_move函数用于处理鼠标移动事件,当鼠标在屏幕上移动时,它会打印出鼠标当前的位置坐标。on_mouse_click函数则处理鼠标点击事件,它会根据鼠标按键的状态(按下或释放)和点击位置打印相应的信息。on_mouse_scroll函数则处理鼠标滚动事件,它会打印出滚动发生的位置以及滚动的方向和距离。
对于键盘事件,代码中定义了on_key_press和on_key_release两个回调函数,分别处理按键按下和释放的事件。这些函数能够捕获按键的字符信息或者特殊按键的标识,并根据按键的类型打印出相应的信息。特别地,当检测到Esc键被按下时,程序会停止鼠标和键盘的监听,并退出运行。
在定义了这些回调函数之后,代码创建了鼠标监听器和键盘监听器对象,并将这些回调函数作为参数传递给监听器。然后,通过调用监听器的start方法,程序开始监听鼠标和键盘事件。在监听器运行期间,程序会等待直到用户手动停止监听或者发生异常。当用户按下Ctrl+C时,程序会捕获到KeyboardInterrupt异常,并停止监听器运行。
总体而言,这段代码充分展示了pynput库在处理输入设备事件方面的强大能力,它不仅可以捕获鼠标和键盘的基本操作,还可以对特殊按键和复杂事件进行处理。这对于开发需要与用户进行交互的应用程序来说,是一个非常有用的工具。这段代码适用于需要监控鼠标和键盘输入的应用场景,例如自动化测试、用户行为分析、游戏脚本等。注意,在实际应用中,可能需要处理更多的异常和边界情况,以确保程序的健壮性。
二、结构说明
1. 导入模块
代码首先导入了pynput库中的mouse和keyboard模块。这两个模块分别提供了对鼠标和键盘事件的监听和处理功能,为后续的代码实现提供了基础。
2. 定义回调函数
接着,代码定义了多个回调函数,用于处理各种鼠标和键盘事件。这些函数包括:
on_mouse_move:处理鼠标移动事件,打印鼠标当前位置。on_mouse_click:处理鼠标点击事件,根据按钮状态和点击位置打印信息。on_mouse_scroll:处理鼠标滚动事件,打印滚动位置和滚动量。on_key_press和on_key_release:分别处理键盘按键按下和释放事件,打印按键信息。这些回调函数是代码的核心部分,它们定义了当特定事件发生时应该执行的操作。
3. 创建监听器
在定义了回调函数之后,代码创建了两个监听器对象:mouse_listener和keyboard_listener。这两个监听器分别用于监听鼠标和键盘事件。在创建监听器时,将之前定义的回调函数作为参数传递给监听器,以便在事件发生时调用这些函数。
4. 启动监听器
通过调用监听器的start方法,代码开始监听鼠标和键盘事件。此时,程序会进入等待状态,直到有事件发生或者用户手动停止监听。
5. 事件处理循环
监听器启动后,代码进入了事件处理循环。在这个循环中,程序会持续监听并处理输入设备的事件,直到用户触发退出条件(如按下Esc键)。mouse_listener.join()和keyboard_listener.join()确保了主线程会等待监听器线程完成后再继续执行。
6. 异常处理与退出机制
代码中还包含了异常处理和退出机制。当用户按下Ctrl+C时,会触发KeyboardInterrupt异常,代码通过捕获这个异常来停止监听器并退出程序。此外,当检测到Esc键被按下时,也会通过调用监听器的stop方法来停止监听并退出。
相关文章:
Python使用pynput模块后台监控鼠标及按键
Pynput 是一个 Python 第三方库,它提供了监听和控制键盘和鼠标事件的功能。使用 pynput,我们可以编写自动化脚本,监控输入设备的活动,或者实现一些与键盘和鼠标相关的功能。 一、功能说明 这段代码是运用pynput库实现对鼠标和键盘…...
C语言 扫雷游戏
写了这么长时间的关于C语言的基础知识,相信大家已经学会了使用C语言书写一些基础的代码,上次还编写了三子棋游戏的代码,这次我将编写一个基础版的扫雷游戏。 首先,创建三个文件,两个源文件,一个头文件&…...
HTML学习:图片格式——超链接
一、图片格式 1.jpg格式 概述:扩展名为.jpg 或.jpeg ,是一种有损的压缩格式(把肉眼不容易观察出来的细节丢弃了)。 主要特点:支持的颜色丰富、占用空间较小、不支持透明背景、不支持动态图。 使用场景:对图片细节没有极高要求的场景,例如:网站的产品…...
工业级5g路由器使用案例(5g智慧安防解决方案)
项目背景: 现代化智慧安防需要满足远程可视化监控、设备联网管理、数据加密传输等多重需求,对通信网络的带宽、时延、安全性等提出了很高要求。业内急需一款高可靠、高性能、易管理的通信网关设备,来确保安防系统的顺利运行。 安装部署: SR800-D路由器采用紧凑型全金属机箱…...
sentinel熔断降级
熔断降级 Slot 责任链上的最后一环:熔断降级 DegradeSlot,熔断降级作为保护系统的一种强大手段,可以根据慢调用、异常比例和异常数进行熔断,并自定义持续时间以实现系统保护 规则配置 规则类中属性解析 与控制面板对应 // 其中资源名称在 AbstractRule 里。 pu…...
Redis的安装和部署教程(Windows环境)
一、安装Redis服务 1、下载Redis压缩包 以下这个是我网盘里面的(这个是v8.0版本的,支持导入.rdb数据文件) 链接:百度网盘 请输入提取码 提取码:x0f1 --来自百度网盘超级会员V5的分享 2、解压到文件夹 将下载的压缩…...
MNN Session::resize 之流水线编码(五)
系列文章目录 MNN createFromBuffer(一) MNN createRuntime(二) MNN createSession 之 Schedule(三) MNN createSession 之创建流水线后端(四) MNN Session::resize 之流水线编码&am…...
2. IS-IS 基础实验
2.1 IS-IS 配置实验 2.1.1 实验介绍 2.1.1.1 学习目标 1. 实现 IS-IS 协议基本配置 2. 实现 IS-IS 协议 DIS 优先级修改 3. 实现 IS-IS 协议网络类型修改 4. 实现 IS-IS 协议外部路由引入 5. 实现 IS-IS 接口 cost 修改 6. 实现 IS-IS 路由渗透配置 2.1.1.2 实验组网介…...
Rust 并行库 crossbeam 的 Channel 示例
示例1 一个不完整的示例: let (tx, rx) channel::unbounded::<Task>(); let mut handlers vec![];for _ in 0..number {let rx rx.clone();let handle thread::spawn(move || {while let Some(task) rx.recv() {task.call_box();}});handlers.push(han…...
缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级的理解
一:缓存雪崩 我们可以简单的理解为:由于原有缓存失效,新缓存未到期间 (例如:我们设置缓存时采用了相同的过期时间,在同一时刻出现大面积的缓存过期),所有原本应该访问缓存的请求都去查询数据库了ÿ…...
springcloud gateway
一、 predicate : 就是你定义一些规则,如果满足了这些规则,就去找到对应的路由。 对于strip 二、自定义过略器和全局过滤器 约定大于配置,后缀不变,只改前缀 sentinel持久化 三、sentinel quick-start | Sentinel 信号量虽然简…...
JAVA八股day1
遇到的问题 相比于包装类型(对象类型), 基本数据类型占用的空间往往非常小为什么说是几乎所有对象实例都存在于堆中呢?静态变量和成员变量、成员变量和局部变量的区别为什么浮点数运算的时候会有精度丢失的风险?如何解…...
探索拓展坞的奥秘:提升电脑接口的无限可能
在数字化时代的浪潮中,电脑已成为我们日常生活和工作中不可或缺的一部分。然而,随着外接设备的日益增多,电脑接口的数量和类型往往无法满足我们的需求。这时,拓展坞便应运而生,以其强大的扩展能力和便捷的使用方式&…...
Linux中执行脚本报错(脚本乱码问题)
主要原因是在windows中编译文件格式导致 linux下解决: 方案一: Linux下打开shell文件,用vi/vim命令打开脚本文件,输入“:set fileformatunix”,回车,保存退出。 方案二: yum install -y dos2uni…...
el-table按钮获取当前行元素
el-table按钮获取当前行元素 vue2 <el-table-column label"操作" width"240px"><template slot-scope"scope"><el-button size"mini" click"toItem(scope.row)">用户详情</el-button><el-butto…...
MySQL数据导入的方式介绍
MySQL数据库中的数据导入是一个常见操作,它涉及将数据从外部源转移到MySQL数据库表中。在本教程中,我们将探讨几种常见的数据导入方式,包括它们的特点、使用场景以及简单的示例。 1. 命令行导入 使用MySQL命令行工具mysql是导入数据的…...
构建部署_Docker常用命令
构建部署_Docker常见命令 启动命令镜像命令容器命令 启动命令 启动docker:systemctl start docker 停止docker:systemctl stop docker 重启docker:systemctl restart docker 查看docker状态:systemctl status docker 开机启动&…...
Spring Boot Actuator介绍
大家在yaml中经常见到的这个配置 management: endpoints: web: exposure: #该配置线上需要去掉,会有未授权访问漏洞 include: "*" 他就是Actuator! 一、什么是 Actuator Spring Boot Actuator 模块提供了生产级别…...
数据库中DQL、DML、DDL、DCL的概念与区别
目录 DQL (Data Query Language) DML (Data Manipulation Language) DDL (Data Definition Language) DCL (Data Control Language) 数据库语言可以根据其功能被分为几个不同的类别:DQL(数据查询语言)、DML(数据操纵语言&…...
MacOS---设置Java环境变量
介绍 在MacOS系统配置Java环境变量。 操作步骤 第一步:打开.bash_profile文件 vim ~/.bash_profile第二步:添加或修改配置 如果是第一次配置需要添加配置如果是已经配置过想更换其他版本需要修改配置 在文件末尾添加或修改下面的配置 export JAVA…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
