https://www.xin3721.com/eschool/pythonxin3721/

§ 0.0.0 前言

监听、操作鼠标、键盘是实现自动化的捷径,比如我实现自动化签到用到了模拟键盘操作。

pynput是监听、操控鼠标和键盘的跨平台第三方python库。

你可以通过pip insnall pynput来安装。安装时会自动下载依赖库。

pypi链接在此。

接下来我会按“鼠标按键”“监听鼠标”“控制鼠标”,

“键盘按键”“监听键盘”“控制键盘”的顺序介绍它的用法。

以下为正文。

§1.0.0 鼠标按键

鼠标的按键在pynput.mouse.Button中,

有lift、right、middle还有unknown四种。

每一个按键都有两个有意义的属性:name和value。

name是该按键的名称,比如 Button.left.name == 'left';

value是记录上一次点击位置的元组。

§1.1.0 监听鼠标

有两种方法,一种是函数式、非阻塞型,另一种是语句式、阻塞型。

先说第一种,这种是常见的教程所说的方法。

§1.1.1 pynput.mouse.Listener

以下是官网的说明示例:

import pynput, time

def on_move(x, y):

print('Pointer moved to {0}'.format((x, y)))

def on_click(x, y, button, pressed):

print('{0} at {1}'.format(

'Pressed' if pressed else 'Released',

(x, y)))

if not pressed:

# Stop listener

return False

def on_scroll(x, y, dx, dy):

print('Scrolled {0} at {1}'.format(

'down' if dy < 0 else 'up',

(x, y)))

# Collect events until released

with pynput.mouse.Listener(

on_move=on_move,

on_click=on_click,

on_scroll=on_scroll) as listener:

listener.join()

运行这段代码时,移动鼠标会显示其坐标,

按下鼠标按键并松开后,程序结束。

当三个函数任意一个返回False((还有就是释放Exception或继承自Exception的异常)时,就会结束进程。

可以用listener.start()和listener.stop()代替with语句。

§1.1.2 pynput.mouse.Events

个人认为,这个方法比上一个更直观。

import pynput

with pynput.mouse.Events() as event:

for i in event:

#迭代用法。

if isinstance(i, pynput.mouse.Events.Move):

#鼠标移动事件。

print(i.x, i.y)

#不要直接打印`i`,模块这里有问题,会报错。

elif isinstance(i, pynput.mouse.Events.Click):

#鼠标点击事件。

print(i.x, i.y, i.button, i.pressed)

#这个i.button就是上文所说的“鼠标按键”中的一个,用is语句判断即可。

elif isinstance(i, pynput.mouse.Events.Scroll):

#鼠标滚轮。

print(i.x, i.y, i.dx, i.dy)

break

i = event.get(1)

#另一种用法。

#默认值是None。

#这个`1`就是最长等待时间,超过这个时间没有事件,

#就会报错。错误类型是queue模块的Empty,而非TimeoutError。

§1.2.0 控制鼠标

§ 1.2.1

先执行pynput.mouse.Controller()获取控件。

以下方法都是该控件的所属方法。

如下:

import pynput

ctr = pynput.mouse.Controller()

§ 1.2.2

动态属性position返回鼠标位置坐标的元组(像这样: (x, y) ),

通过定义来改变鼠标位置,比如ctr.position = (500, 500)。

§ 1.2.3

当然,也有move方法,用于移动鼠标,

用法是ctr.move(dx, dy)。

§ 1.2.4

使用方法click进行模拟点击,需提供点击的按钮,

按钮在pynput.mouse.Button里,有left、right和middle。

还有可选参数count,是点击次数,默认为1。

示例:

import pynput

ctr = pynput.mouse.Controller()

ctr.click(pynput.mouse.Button.left)

#左键单击。

ctr.click(pynput.mouse.Button.left, 2)

#左键双击。

ctr.click(pynput.mouse.Button.right)

#右键单击。

§ 1.2.5

使用press(button)按下button键;

方法release(button)释放键,如果按键并没有按下,也不会报错。

示例:

import pynput

ctr = pynput.mouse.Controller()

ctr.press(pynput.mouse.Button.left)

#按下左键。

ctr.move(50, 0)

#右移50单位。

ctr.move(0, 50)

#下移50单位。

ctr.release(pynput.mouse.Button.left)

#释放左键。

§ 1.2.6

模拟滚轮,使用的方法是scroll,提供参数dx和dy。

例:

import pynput

ctr = pynput.mouse.Controller()

ctr.scroll(0, 50)

#向上滚动50单位。

ctr.scroll(0, -50)

#向下滚动50单位。

以上是鼠标操作,

以下是键盘操作。

§ 2.0.0 键盘按键

键盘的按键获取比鼠标的麻烦些,但是没有鼠标用得多。

因此我先说给常用的使用方法,再说获取。

§ 2.0.1 使用方法

首先,当获取事件后,要判断按键是“特殊按键”还是“普通按键”,

需判断其是否具有name属性,有则是特殊按键。

这个属性记录属性的名称,比如ctrl对应着'ctrl'、'ctrl_l'或是'ctrl_r'。

普通按键中,取而代之的是.char。

注:大写字母与小写字母有不同的按键。

还有其他功能。这里就不多说了。

§ 2.0.2 获取

首先,特殊按键在pynput.keyboard.Key“模块”中可以直接找到。

比如ctrl对应pynput.keyboard.Key.ctrl还有.ctrl_l以及.ctrl_r。

然后,普通按键可以通过pynput.keyboard.KeyCode.from_char取得(特殊按键不可以,使用时会出现ArgumentError)。

如a可以运行pynput.keyboard.KeyCode.from_char('a')获得。

二者都可以用pynput.keyboard.KeyCode.from_vk通过按键的映射码取得。

§ 2.1.0 监听键盘

主要有两种方法,类似于鼠标的,我的讲述顺序同前文。

还有一种是对Listener的封装,用于快捷键,我放在最后一个说。

§ 2.1.1 pynput.keyboard.Listener

官网示例:

from pynput import keyboard

def on_press(key):

'按下按键时执行。'

try:

print('alphanumeric key {0} pressed'.format(

key.char))

except AttributeError:

print('special key {0} pressed'.format(

key))

#通过属性判断按键类型。

def on_release(key):

'松开按键时执行。'

print('{0} released'.format(

key))

if key == keyboard.Key.esc:

# Stop listener

return False

# Collect events until released

with keyboard.Listener(

on_press=on_press,

on_release=on_release) as listener:

listener.join()

当两个函数中任意一个返回False(还有就是释放Exception或继承自Exception的异常)时,就会结束进程。

可以用listener.start()和listener.stop()代替with语句。

§ 2.1.2 pynput.keyboard.Events

import pynput

with pynput.keyboard.Events() as event:

for i in event:

#迭代用法。

key_event = i

break

key_event = event.get()

#get用法。

#可以提供一个实数作为最长等待时间(单位秒),超过这个时间没有事件,

#就会报错。错误类型是queue模块的Empty,而非TimeoutError。

#判断事件情况:

if isinstance(key_event, pynput.keyboard.Events.Press):

print('按下按键', end = '')

elif isinstance(key_event, pynput.keyboard.Events.Release):

print('松开按键', end = '')

#判断按键:

#*这个事件的`key`属性*对应才是*Listener方法获得的按键`'key'`*。

try:

print(key_event.key.name)

except AttributeError:

#说明这个是普通按键。

print(key_event.key.char)

else:

#两种判断方式,第一种是我自创的,第二种是官网上的。

if (key_event.key.name).startswith('ctrl'):

#通过名称判断。

print('发生了ctrl键事件。')

elif key_event.key is pynput.keyboard.Key.esc:

print('发生了esc键事件。')

§ 2.1.3 pynput.keyboard.GlobalHotKeys

(还有'pynput.keyboard.HotKey'可以实现相似功能,但很麻烦)

官网示例,esc那个是我写的。

from pynput import keyboard

def on_activate_h():

print('++h pressed')

def on_activate_i():

print('++i pressed')

def esc():

print(' pressed')

return False

def esc_shift():

print('+ pressed')

raise Exception

with keyboard.GlobalHotKeys({

'++h': on_activate_h,

'++i': on_activate_i,

'': esc,

'+': esc_shift}) as h:

h.join()

当按下esc键时,函数被触发,但运行未停止。

观察源码,发现虽然该类继承自Listener,但会对执行的函数有封装,封装后只返回None。

所以无法通过return False结束进程。

§ 2.2.0 控制键盘

§ 2.2.1

先获取控件 :ctr = pynput.keyboard.Controller()。

以下所说的方法均是指该控件的方法。

§ 2.2.2

通过方法press来按下按键,

你需要提供一个“长度为1的字符”或是“前文所说的按键对象”。

温馨提示,此方法测试有风险,如果发现电脑打字、操作异常,

很可能是因为模拟按下了某个键未松开。

可以重启控制台或电脑。

§ 2.2.3

通过release释放按键,

和press方法一样,需要提供一个“长度为1的字符”或是“前文所说的按键对象”。

示例:

'''

这段程序会按“下ctrl+shilf+s”快捷键,停顿3秒后按下esc键。

简单模拟了“另存为”操作。

'''

import pynput, time

ctr = pynput.keyboard.Controller()

ctr.press(pynput.keyboard.KeyCode.from_vk(17))

#通过按键的映射码 按下ctrl键。

ctr.press(pynput.keyboard.Key.shift)

#通过按键对象 按下shift键。

ctr.press('s')

#通过长度为1的字符 按下s键。

#扫尾,释放刚才按下的键。后面我会说更简单、优雅的办法。

ctr.release(pynput.keyboard.Key.ctrl)

ctr.release(pynput.keyboard.Key.shift)

ctr.release('s')

time.sleep(0.3)

ctr.press(pynput.keyboard.Key.esc)

ctr.release(pynput.keyboard.Key.esc)

§ 2.2.4

pressed方法就是我说的“更简单、优雅”的方法。

使用时提供要按下的键,再用with语句“封装”上。

效果是进入语句块时顺序按下提供按键,退出语句块时逆序释放按键。

如下:

import pynput, time

ctr = pynput.keyboard.Controller()

with ctr.pressed(

pynput.keyboard.Key.ctrl,

pynput.keyboard.Key.shift,

's'):

pass

time.sleep(0.3)

with ctr.pressed(pynput.keyboard.Key.esc):

pass

§ 2.2.5

type在英语中除了“类型”还有“打字”之意。

该方法接收字符串,然后打出每个字符。

据测试,向它提供一个“按键列表”也可以正常使用。

例:

import pynput

ctr = pynput.keyboard.Controller()

ctr.type('Hello world!')

ctr.type([pynput.keyboard.Key.esc])

#按下esc再松开。

以上是正文。

一些建议

该模块鼠标、键盘的监听操作均由多线程实现。

所以,可以利用多线程共享内存的特征编程;二要注意不要频繁启动监听,这样对系统开支极大。

还有就是对鼠标位置监听要求不是很高时(比如实时向用户显示鼠标位置),可以每次循环sleep一下。

如果向Listener提供的函数会执行很久(比如含有sleep),会导致电脑变卡。

闲谈

之前和别人聊天,他说他在不需要时把电脑的麦拔下来、摄像头挡上。

我说用Fn快捷键禁掉麦克风更方便。

现在想想,黑客可以通过模拟按键解禁麦克风啊。

虽然这个模块没有Fn键,但别的呢?

最后

这份算是最全的了。原创不易,纯手打。

转载请注明作者和链接哦。

python监听键盘库_python监听、操作键盘鼠标库pynput详细教程|python基础教程|python入门|python教程...相关推荐

  1. python键盘监听模块大全_python监听、操作键盘鼠标库pynput详细教程

    § 0.0.0 前言 监听.操作鼠标.键盘是实现自动化的捷径,比如我实现自动化签到用到了模拟键盘操作. pynput是监听.操控鼠标和键盘的跨平台第三方python库. 你可以通过pip insnal ...

  2. python监听键盘输入_Python监听模拟鼠标键盘

    1.监听鼠标和键盘的输入 from pynput import keyboard,mouse def on_press(key): print('alphanumeric key {0} presse ...

  3. ROS中 Python/C++ 键盘按键监听事件

    ROS中 Python/C++ 键盘按键监听事件 这几天在肝全国智能驾驶大赛,真就挺累的:抓狂思考,手搓代码,疯狂编译,要命运行.在这趟火车上,被各种各样的问题卡住甚至卡死,就很难受好吧.至今,我深深 ...

  4. openlayers学习——10、openlayers监听获取鼠标坐标位置

    openlayers监听获取鼠标坐标位置 前言:基于Vue,学习openlayers,根据官网demo,记录常用功能写法.本人不是专业GIS开发,只是记录,方便后续查找. 参考资料: openlaye ...

  5. 二、python小功能记录——监听鼠标事件

    1.原文链接 #-*- coding:utf-8 -*- from pynput.mouse import Button, Controller## ========================= ...

  6. python键盘控制_python如何直接控制鼠标键盘

    一.简介 我们知道在windows下输入:win + r,会弹出下面的窗口,而在下面的窗口出现后我们接着按下esc键,下面的窗口会消失 现在设想我们想在python代码里控制键盘,想通过运行代码-&g ...

  7. python tcp不用循环监听_网络编程: TCP

    1. IP 地址 概念: 标识网络中设备的地址(需要联网才有没有联网, 是没有这个地址) 表现形式: ipv4 目前主要使用的, 点分十进制的格式,(192.168.3.43) 分为 4 段, 每段的 ...

  8. python3 mysql报警日志_Python监听MySQL日志

    前言 在使用后台语言开发中,每天都是在与数据库打交道,而很多时候出问题都出在SQL语句上,而调试起来也不太方便,当然大佬例外哈,我等新手还真没办法在短时间内练习出一些技巧,我是用PHP的,之前在网上也 ...

  9. 事件监听机制——鼠标事件MouseEvent

    鼠标事件 鼠标事件包括鼠标的双击.左击.右击.中间键等等,本文进行事件加载进行简单介绍,具体可以参考键盘事件. import java.awt.*; import java.awt.event.*;/ ...

最新文章

  1. opencv 星空_opencv各种小例子
  2. opencv 设置视频帧的分辨率“无效”
  3. 【深度学习】人人都能看得懂的卷积神经网络——入门篇
  4. 科幻作家阿西莫夫上世纪预言2019: 计算机彻底变革教育,太空移民进行中
  5. linux中类似findfirst的函数,findfirst函数的用法
  6. linux HA工作模型详解
  7. c语言无输出如何表示,c语言中的格式输出
  8. linux文件权限说明(drwxr-xr-x)
  9. python PDF文件拆分与合并
  10. 图像处理学习——色彩空间
  11. SDR HDR 区别
  12. 离散数学——Euler 图与 Hamilton 图
  13. Adobe BrowserLab开放注册并发布升级
  14. Splatter Painting
  15. python实验九答案_Python程序设计实验报告(九)
  16. 计算机人文素养教案,小学信息技术课堂中人文素养的教学探究
  17. 微信发送验证码进行验证
  18. 2021最新影视双端APP无加密修复版源码 附详细搭建图文教程
  19. PDF文件取消限制密码
  20. MySQL基础 - 列的属性

热门文章

  1. inode索引节点的概念
  2. java组合与继承始示例_排列组合:用公式示例解释的差异
  3. corba的兴衰_代码广播的兴衰
  4. java springMVC生成二维码
  5. 图解高性能服务器开发两种模式,第四章 NETTY高性能架构设计
  6. Java:节点流和处理流的理解
  7. 手把手教你用Python实现“坦克大战”,附详细代码!
  8. 源码分析参考:Connection
  9. NPM是什么?我们该怎么使用呢
  10. Python使用openpyxl模块读写excel文件