【python自动化】03. pynput库自动操作键鼠(保姆级代码注释)


『python自动化』分享win32gui、cv2、easyocr等库相关的新手入门教程,目标是编写python程序进行自动化办公,解放双手。

欢迎关注 『python自动化』 系列,持续更新中
欢迎关注 『python自动化』 系列,持续更新中

资源下载

拿来即用,所见即所得。

我的gitee仓库pynput库自动操作键鼠
在这里插入图片描述


安装pynput库

pip install pynput

在这里插入图片描述


实现思路

  • pynput库比起之前的pywin32库提供了更简便的键鼠操作。

  • 另一个区别是先初始化一个鼠标或是键盘的对象,对于这个对象进行操作,不同于面向窗口的win32。但是缺点是,导致了前台的问题,操作顶层的前台窗口。

API介绍

下面的代码实战会详细介绍每个方法的参数,也可以访问pywin32的官方文档查看。(建议这么做,因为以后我们自学其他库都要经历查看文档这个过程)

官网网址
https://pythonhosted.org/pynput/

代码实战

一、鼠标控制

1. 创建鼠标控制对象

mouse = Controller()

2. 获取一次当前鼠标位置

原型:鼠标对象.position
实例:x,y=mouse.position

x,y=mouse.position#返回了一个位置坐标的元组
print("x方向鼠标位置:{},y方向鼠标位置:{}".format(x,y))

3. 修改鼠标位置

原型:鼠标对象.position=(x坐标,y坐标)
实例:mouse.position=(666,666)

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)

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

mouse.position=(888,888)
mousePosition=mouse.position
mouse.click(Button.left,1)#鼠标左键点击1次,第一个参数表示左右键,第二个参数表示点击次数

我们自己封装一个函数,新增了一个参数用于表示点击延迟
原型:mzhClick(操作的鼠标键位,点击次数,点击延迟)
示例:mzhClick(Button.left,2,10)
返回值:None

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. 鼠标移动监听

这个程序运行后你的所有鼠标移动都会有显示提示,不移动则不会输出信息。

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)

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)

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. 创建键盘控制对象

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)#弹起空格键位

补充一下常见的特殊键位

alt= <Key.f1: 0>
一个通用的 Alt 键。这是一个修饰符。

alt_gr= <Key.f1: 0>
AltGr 键。这是一个修饰符。

alt_l= <Key.f1: 0>
左 Alt 键。这是一个修饰符。

alt_r= <Key.f1: 0>
右 Alt 键。这是一个修饰符。

backspace= <Key.f1: 0>
退格键。

caps_lock= <Key.f1: 0>
大写锁定键。

cmd= <Key.f1: 0>
一个通用的命令按钮。在PC平台上,这对应于 Super 键或 Windows 键,而在Mac上,它对应于 Command 键。这可能是一个修饰符。

cmd_l= <Key.f1: 0>
左侧命令按钮。在PC平台上,这对应于 Super 键或 Windows 键,而在Mac上,它对应于 Command 键。这可能是一个修饰符。

cmd_r= <Key.f1: 0>
右命令按钮。在PC平台上,这对应于 Super 键或 Windows 键,而在Mac上,它对应于 Command 键。这可能是一个修饰符。

ctrl= <Key.f1: 0>
一个通用的 Ctrl 键。这是一个修饰符。

ctrl_l= <Key.f1: 0>
左 Ctrl 键。这是一个修饰符。

ctrl_r= <Key.f1: 0>
右 Ctrl 键。这是一个修饰符。

delete= <Key.f1: 0>
删除键。

down= <Key.f1: 0>
向下箭头键。

end= <Key.f1: 0>
结束键。

enter= <Key.f1: 0>
Enter 或 Return 键。

esc= <Key.f1: 0>
Esc 键。

f1= <Key.f1: 0>
功能键。定义了 F1 到 F20。

home= <Key.f1: 0>
主页键。

insert= <Key.f1: 0>
插入键。对于某些平台,这可能是未定义的。

left= <Key.f1: 0>
一个左箭头键。

menu= <Key.f1: 0>
菜单键。对于某些平台,这可能是未定义的。

num_lock= <Key.f1: 0>
NumLock 键。对于某些平台,这可能是未定义的。

page_down= <Key.f1: 0>
PageDown 键。

page_up= <Key.f1: 0>
PageUp 键。

pause= <Key.f1: 0>
暂停/中断键。对于某些平台,这可能是未定义的。

print_screen= <Key.f1: 0>
PrintScreen 键。对于某些平台,这可能是未定义的。

right= <Key.f1: 0>
一个右箭头键。

scroll_lock= <Key.f1: 0>
滚动锁定键。对于某些平台,这可能是未定义的。

shift= <Key.f1: 0>
一个通用的 Shift 键。这是一个修饰符。

shift_l= <Key.f1: 0>
左 Shift 键。这是一个修饰符。

shift_r= <Key.f1: 0>
右 Shift 键。这是一个修饰符。

space= <Key.f1: 0>
空格键。

tab= <Key.f1: 0>
Tab 键。

up= <Key.f1: 0>
向上箭头键。
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实现自动切换界面,原理就是按下一个键不马上弹起,继续按下别的键

#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)

from pynput.keyboard import Controller, Key
keyboard =Controller()
keyboard.type("我输入了内容!")

keyboard.type("&")
keyboard.touch("&",True)#输入字符用touch方法

四、键盘监听

制作一个简易的键码查询器

按下或是弹起键位就会输出键位的键码信息,按左上角的esc键位可以退出程序。

#键码查询器,想知道哪个键位的键码就运行程序按下按键。原理是监听按键的按下和弹起并打印键码
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自动化』 系列,持续更新中
欢迎关注 『python自动化』 系列,持续更新中
【python自动化】01.安装配置库和环境之win32gui安装失败(保姆级图文)
【python自动化】02. pywin32库自动操作键鼠(保姆级代码注释)
【python自动化】03. pynput库自动操作键鼠(保姆级代码注释)
【更多内容敬请期待】


  • 10
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

发现你走远了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值