# pynput库自动操作键鼠
**Repository Path**: gusong125/pynput-auto
## Basic Information
- **Project Name**: pynput库自动操作键鼠
- **Description**: pynput库自动操作键鼠,CSDN博主 ——发现你走远了
转载请说明原作者并放置链接
专栏传送门https://blog.csdn.net/u011027547/category_11976162.html
解读博文传送门https://blog.csdn.net/u011027547/article/details/126484234
- **Primary Language**: Python
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: https://blog.csdn.net/u011027547/article/details/126484234
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 3
- **Created**: 2024-12-23
- **Last Updated**: 2024-12-23
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
@[toc](目录)
『python自动化』分享win32gui、cv2、easyocr等库相关的新手入门教程,目标是编写python程序进行自动化办公,解放双手。
> **欢迎关注 [『python自动化』 系列](https://blog.csdn.net/u011027547/category_11976162.html),持续更新中**
> **欢迎关注 [『python自动化』 系列](https://blog.csdn.net/u011027547/category_11976162.html),持续更新中**
## 资源下载
拿来即用,所见即所得。
我的gitee仓库[pynput库自动操作键鼠](https://gitee.com/miao-zehao/pynput-auto/tree/master/)

## 安装pynput库
```python
pip install pynput
```

## 实现思路
- pynput库比起之前的pywin32库提供了更简便的键鼠操作。
- 另一个区别是先初始化一个鼠标或是键盘的对象,对于这个对象进行操作,不同于面向窗口的win32。但是缺点是,导致了前台的问题,操作顶层的前台窗口。
### API介绍
下面的代码实战会详细介绍每个方法的参数,也可以访问pywin32的官方文档查看。(建议这么做,因为以后我们自学其他库都要经历查看文档这个过程)
```python
官网网址
https://pythonhosted.org/pynput/
```
# 代码实战
## 一、鼠标控制
### 1. 创建鼠标控制对象
```python
mouse = Controller()
```
### 2. 获取一次当前鼠标位置
>原型:鼠标对象.position
>实例:x,y=mouse.position
```python
x,y=mouse.position#返回了一个位置坐标的元组
print("x方向鼠标位置:{},y方向鼠标位置:{}".format(x,y))
```
### 3. 修改鼠标位置
>原型:鼠标对象.position=(x坐标,y坐标)
>实例:mouse.position=(666,666)
```python
mousePosition=mouse.position
print("修改前鼠标位置:{0}".format(mousePosition))
mouse.position=(666,666)#把鼠标位置设置为 (666,666)
mouseposition=mouse.position
print("修改后鼠标位置:{0}".format(mouseposition))
```
### 4. 鼠标执行点击与弹起
>原型:鼠标对象.press=(按键)
>实例:mouse.press(Button.left)
```python
print("3秒后点击鼠标停留的位置")
win32api.Sleep(3000)#休眠等待3秒
# 模拟左键点击与弹起操作
mouse.position=(666,666)#把鼠标位置设置为 (666,666)
mousePosition=mouse.position
print("即将被左键点击与弹起的鼠标位置:{0}".format(mousePosition))
mouse.press(Button.left)#左键按下
win32api.Sleep(50)#有些要求点击有一些延迟
mouse.release(Button.left)#左键弹起
# 模拟右键点击与弹起操作
print("即将被右键点击与弹起的鼠标位置:{0}".format(mousePosition))
mouse.press(Button.right)#右键按下
win32api.Sleep(50)#有些要求点击有一些延迟
mouse.release(Button.right)#右键弹起
```
### 5. 鼠标点击封装调用
>官方现有的函数
>原型:mouse.click(操作的鼠标键位,点击次数)
>示例:mouse.click(Button.left,1)
>返回值:None
```python
mouse.position=(888,888)
mousePosition=mouse.position
mouse.click(Button.left,1)#鼠标左键点击1次,第一个参数表示左右键,第二个参数表示点击次数
```
>我们自己封装一个函数,新增了一个参数用于表示点击延迟
>原型:mzhClick(操作的鼠标键位,点击次数,点击延迟)
>示例:mzhClick(Button.left,2,10)
>返回值:None
```python
def mzhClick(ButtonType,clickTimes,clickDelay):
# 模拟左键点击延迟一段时间后再弹起的操作
for i in range(clickTimes):
mouse.press(ButtonType)#左键按下
win32api.Sleep(clickDelay)#有些时候,我们的这个点击延迟可以加入随机数,这样看起来更接近真人的操作
mouse.release(ButtonType)#左键弹起
mouse.position=(629,254)
mousePosition=mouse.position
mzhClick(Button.left,2,10)#双击,每次点击弹起延时10毫秒
```
## 二、鼠标监听
### 1. 鼠标移动监听
这个程序运行后你的所有鼠标移动都会有显示提示,不移动则不会输出信息。
```python
import win32api
import time
from pynput.mouse import Listener, Button
def mouseListener(on_move):#监听函数
with Listener(on_move=on_move) as listener:#定义on_move回调函数用于在鼠标移动时生效
listener.join()#添加监听器
def on_move(x, y):
timeStruct = time.localtime(int(time.time())) # 获得当前时间时间戳后转化为本地时间
strTime = time.strftime("%Y-%m-%d %H:%M:%S", timeStruct) # 日期格式 2022-08-23 07:26:21
print("{}鼠标坐标:{}".format(strTime,(x, y)))
#win32api.Sleep(100) #警告:不要取消注释这一行代码。不要尝试在这入延时,否则会真的让你的鼠标移动速度变慢,你可以类比理解为降低了你的鼠标DPI
#也许你可以用上述特性来制作一个软件用于在fps游戏中压枪·······?
mouseListener(on_move)#调用我们写好的监听函数
```

### 2. 鼠标点击监听
>原型:mouseListener(点击监听回调)
>示例:mouseListener(on_click)
```python
from pynput.mouse import Listener, Button
def mouseListener(on_click):
with Listener(on_click=on_click) as listener:#定义on_click回调函数用于在鼠标点击时生效
listener.join()
def on_click(x, y, button, pressed):
print("鼠标位置为:{},执行操作为:{},是否点击或松开:{}".format((x, y), button, pressed))
mouseListener(on_click)
```

### 3. 监听鼠标点击、滚动、拖动
>原型:mouseListener(移动监听回调, 点击监听回调, 滚动监听回调)
>示例:mouseListener(on_move, on_click, on_scroll)
```python
from pynput.mouse import Listener, Button
from pynput import mouse
def mouseListener(on_move, on_click, on_scroll):
with Listener(on_move=on_move, on_click=on_click, on_scroll=on_scroll) as listener:
listener.join()
def on_move(x, y):
pass
def on_click(x, y, button, pressed):
if button == mouse.Button.left:
print('鼠标左键单击')
elif button == mouse.Button.right:
print('鼠标右键单击')
else:
print('鼠标滚轮按下,即将结束程序')
print("鼠标坐标:{},鼠标操作为:{},鼠标按下弹起状态:{}".format((x, y), button, pressed))
if button == Button.middle:
return False
#其实这里滚动监听不知道为啥有点问题,我只能监听滚轮,大家有知道的可以评论区讨论分享一下
def on_scroll(x, y, dx, dy):
print("鼠标位置为:{},滚轮上下滑动,1表示上滚,-1表示下滚:{}".format((x, y), (dx, dy)))
mouseListener(on_move, on_click, on_scroll)
```

## 三、键盘控制
### 1. 创建键盘控制对象
```python
from pynput.keyboard import Controller, Key
keyboard =Controller()
```
### 2. 键盘单个键位按下与弹起
>一般按键按下
>原型:keyboard.press(按键字符串或是特殊键码)
>示例:keyboard.press("a")
>一般按键弹起
>原型:keyboard.release(按键字符串或是特殊键码)
>示例:keyboard.release("a")
- 特殊键位,所有的包括ctrl在内的键盘上的其他键位通过这种方式操作
>特殊按键按下
>原型:keyboard.release(按键字符串或是特殊键码)
>示例:keyboard.press(Key.space)#按下 空格键位
>特殊按键弹起
>原型:keyboard.release(按键字符串或是特殊键码)
>示例:keyboard.release(Key.space)#弹起空格键位
> 补充一下常见的特殊键位
```python
alt=
一个通用的 Alt 键。这是一个修饰符。
alt_gr=
AltGr 键。这是一个修饰符。
alt_l=
左 Alt 键。这是一个修饰符。
alt_r=
右 Alt 键。这是一个修饰符。
backspace=
退格键。
caps_lock=
大写锁定键。
cmd=
一个通用的命令按钮。在PC平台上,这对应于 Super 键或 Windows 键,而在Mac上,它对应于 Command 键。这可能是一个修饰符。
cmd_l=
左侧命令按钮。在PC平台上,这对应于 Super 键或 Windows 键,而在Mac上,它对应于 Command 键。这可能是一个修饰符。
cmd_r=
右命令按钮。在PC平台上,这对应于 Super 键或 Windows 键,而在Mac上,它对应于 Command 键。这可能是一个修饰符。
ctrl=
一个通用的 Ctrl 键。这是一个修饰符。
ctrl_l=
左 Ctrl 键。这是一个修饰符。
ctrl_r=
右 Ctrl 键。这是一个修饰符。
delete=
删除键。
down=
向下箭头键。
end=
结束键。
enter=
Enter 或 Return 键。
esc=
Esc 键。
f1=
功能键。定义了 F1 到 F20。
home=
主页键。
insert=
插入键。对于某些平台,这可能是未定义的。
left=
一个左箭头键。
menu=
菜单键。对于某些平台,这可能是未定义的。
num_lock=
NumLock 键。对于某些平台,这可能是未定义的。
page_down=
PageDown 键。
page_up=
PageUp 键。
pause=
暂停/中断键。对于某些平台,这可能是未定义的。
print_screen=
PrintScreen 键。对于某些平台,这可能是未定义的。
right=
一个右箭头键。
scroll_lock=
滚动锁定键。对于某些平台,这可能是未定义的。
shift=
一个通用的 Shift 键。这是一个修饰符。
shift_l=
左 Shift 键。这是一个修饰符。
shift_r=
右 Shift 键。这是一个修饰符。
space=
空格键。
tab=
Tab 键。
up=
向上箭头键。
```
```python
import time
from pynput.mouse import Controller,Button
mouse = Controller()#创建鼠标控制对象
mouse.click(Button.left,1)#鼠标左键点击一次目的是为了激活输入窗口
time.sleep(1)#休眠1秒
from pynput.keyboard import Controller, Key
keyboard =Controller()##创建键盘控制对象
#一般键位
keyboard.press("a")#按下 a键位
keyboard.release("a")#弹起 a键位
keyboard.press("A")#按下 A键位
keyboard.release("A")#弹起 A键位
time.sleep(1)#休眠1秒
#特殊键位,所有的包括ctrl在内的键盘上的其他键位通过这种方式操作
keyboard.press(Key.space)#按下 空格键位
keyboard.release(Key.space)#弹起空格键位
keyboard.press(Key.ctrl)#按下 空格键位
keyboard.release(Key.ctrl)#弹起空格键位
time.sleep(1)#休眠1秒
```
### 3. 键盘多个键位组合使用
>使用`alt+tab`实现自动切换界面,原理就是按下一个键不马上弹起,继续按下别的键
```python
#3.键盘多个键位组合使用
# 切换界面
from pynput.keyboard import Controller, Key
keyboard =Controller()
with keyboard.pressed(Key.alt):#按住alt键的同情况下
keyboard.press(Key.tab)#按住tab
keyboard.release(Key.tab)#弹起tab键
```
### 4. 键盘字符串输出
>键盘字符串输出
>原型:keyboard.type(要输的内容字符串)
>示例:keyboard.type("我输入了内容!")
>键盘字符输出
>原型:keyboard.touch(字符,是否输入)
>示例:keyboard.touch("&",True)
```python
from pynput.keyboard import Controller, Key
keyboard =Controller()
keyboard.type("我输入了内容!")
keyboard.type("&")
keyboard.touch("&",True)#输入字符用touch方法
```
## 四、键盘监听
### 制作一个简易的键码查询器
按下或是弹起键位就会输出键位的键码信息,按左上角的`esc`键位可以退出程序。
```python
#键码查询器,想知道哪个键位的键码就运行程序按下按键。原理是监听按键的按下和弹起并打印键码
from pynput.keyboard import Key, Listener
def on_press(key):
print('按下的键位是{0}'.format(
key))
def on_release(key):
print('弹起的键位是{0}'.format(
key))
if key == Key.esc:
# Stop listener
print("按esc键退出")
return False
# Collect events until released
with Listener(
on_press=on_press,
on_release=on_release) as listener:
listener.join()
```

## 总结
大家喜欢的话,给个👍,点个关注!给大家分享更多有趣好玩的python自动化办公知识!
**版权声明:**
发现你走远了@mzh原创作品,转载必须标注原文链接
Copyright 2022 mzh
Crated:2022-8-1
> **欢迎关注 [『python自动化』 系列](https://blog.csdn.net/u011027547/category_11976162.html),持续更新中**
> **欢迎关注 [『python自动化』 系列](https://blog.csdn.net/u011027547/category_11976162.html),持续更新中**
> [【python自动化】01.安装配置库和环境之win32gui安装失败(保姆级图文)](https://blog.csdn.net/u011027547/article/details/126450109)
> [【python自动化】02. pywin32库自动操作键鼠(保姆级代码注释)](https://blog.csdn.net/u011027547/article/details/126471190)
> [【python自动化】03. pynput库自动操作键鼠(保姆级代码注释)](https://blog.csdn.net/u011027547/article/details/126484234)
> 【更多内容敬请期待】